Merge pull request #3 from openstreetmap/develop

update
This commit is contained in:
morray
2020-04-20 13:33:10 +02:00
committed by GitHub
3068 changed files with 278783 additions and 319550 deletions
+19
View File
@@ -0,0 +1,19 @@
root = true
[*]
trim_trailing_whitespace = true
insert_final_newline = false
[*.{js,json,css,html}]
indent_style = space
indent_size = 4
# EOL for ESLint
# newline follows Airbnb style guide
# mix of indent size between ES5 and ES6 syntax files
[*.js]
end_of_line = lf
insert_final_newline = true
indent_size = tab_width
-2
View File
@@ -1,2 +0,0 @@
js/id/start.js
js/id/end.js
+68 -69
View File
@@ -1,73 +1,72 @@
{
"extends": "eslint:recommended",
"rules": {
"dot-notation": 2,
"eqeqeq": [2, "smart"],
"indent": [0, 4],
"linebreak-style": [2, "unix"],
"no-caller": 2,
"no-catch-shadow": 2,
"no-div-regex": 2,
"no-empty-label": 2,
"no-extend-native": 2,
"no-extra-bind": 2,
"no-floating-decimal": 2,
"no-implied-eval": 2,
"no-invalid-this": 2,
"no-iterator": 2,
"no-labels": 2,
"no-label-var": 2,
"no-lone-blocks": 2,
"no-loop-func": 2,
"no-multi-str": 2,
"no-native-reassign": 2,
"no-new": 2,
"no-new-func": 2,
"no-new-wrappers": 2,
"no-octal": 2,
"no-octal-escape": 2,
"no-process-env": 2,
"no-proto": 2,
"no-return-assign": 0,
"no-script-url": 2,
"no-self-compare": 2,
"no-sequences": 2,
"no-shadow": 0,
"no-shadow-restricted-names": 2,
"no-throw-literal": 2,
"no-unneeded-ternary": 2,
"no-unused-expressions": 2,
"no-unexpected-multiline": 2,
"no-unused-vars": 1,
"no-void": 2,
"no-warning-comments": 1,
"no-with": 2,
"no-use-before-define": [0, "nofunc"],
"semi": [2, "always"],
"semi-spacing": 2,
"space-return-throw-case": 2,
"space-unary-ops": 2,
"wrap-regex": 0,
"quotes": [2, "single"]
},
"globals": {
"d3": false,
"iD": false,
"_": false,
"t": false,
"bootstrap": false,
"Diff3": false,
"rbush": false,
"JXON": false,
"osmAuth": false,
"sexagesimal": false,
"toGeoJSON": false,
"marked": false
},
"env": {
"browser": true
"browser": true,
"node": true,
"es6": true
},
"extends": [
"eslint:recommended"
],
"globals": {
"d3": false
},
"parserOptions": {
"ecmaVersion": 6,
"sourceType": "module"
},
"rules": {
"dot-notation": "error",
"eqeqeq": ["error", "smart"],
"indent": ["off", 4],
"keyword-spacing": "error",
"linebreak-style": ["error", "unix"],
"no-caller": "error",
"no-catch-shadow": "error",
"no-console": "warn",
"no-div-regex": "error",
"no-extend-native": "error",
"no-extra-bind": "error",
"no-floating-decimal": "error",
"no-global-assign": "error",
"no-implied-eval": "error",
"no-invalid-this": "off",
"no-iterator": "error",
"no-labels": "error",
"no-label-var": "error",
"no-lone-blocks": "error",
"no-loop-func": "error",
"no-multi-str": "error",
"no-new": "error",
"no-new-func": "error",
"no-new-wrappers": "error",
"no-octal": "error",
"no-octal-escape": "error",
"no-process-env": "error",
"no-proto": "error",
"no-prototype-builtins": "off",
"no-return-assign": "off",
"no-script-url": "error",
"no-self-compare": "error",
"no-sequences": "error",
"no-shadow": "off",
"no-shadow-restricted-names": "error",
"no-throw-literal": "error",
"no-undef": "error",
"no-unneeded-ternary": "error",
"no-unused-expressions": "error",
"no-unexpected-multiline": "error",
"no-unused-vars": "warn",
"no-unreachable": "warn",
"no-useless-escape": "off",
"no-void": "error",
"no-warning-comments": "warn",
"no-with": "error",
"no-use-before-define": ["off", "nofunc"],
"radix": ["error", "always"],
"semi": ["error", "always"],
"semi-spacing": "error",
"space-unary-ops": "error",
"wrap-regex": "off",
"quotes": ["error", "single"]
}
}
+3
View File
@@ -0,0 +1,3 @@
* text=auto
*.bat eol=crlf
*.js eol=lf
+23 -6
View File
@@ -1,8 +1,25 @@
.DS_Store
transifex.auth
node_modules
.esm-cache
.vscode/
/node_modules/
/.tx/tmp/
npm-debug.log
dist/*.js
dist/*.css
dist/img/*.svg
data/data.js
package-lock.json
the_noun_project.auth
transifex.auth
/dist/*.js
/dist/*.css
/dist/*.map
/dist/data/
/dist/img/*.svg
/dist/mapillary-js/
/dist/pannellum-streetside/
# autogenerated symlinks
land.html
/img
/css/img
/test/css
/test/img
+12 -3
View File
@@ -1,5 +1,14 @@
.DS_Store
transifex.auth
node_modules
.esm-cache
.vscode/
/node_modules/
/.tx/
npm-debug.log
data/data.js
package-lock.json
the_noun_project.auth
transifex.auth
.travis.yml
/docs/
/test/
+8 -8
View File
@@ -1,9 +1,9 @@
language: node_js
sudo: false
before_install:
# https://github.com/travis-ci/travis-ci/issues/3225
- mkdir travis-phantomjs
- wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2 -O $PWD/travis-phantomjs/phantomjs-2.1.1-linux-x86_64.tar.bz2
- tar -xvf $PWD/travis-phantomjs/phantomjs-2.1.1-linux-x86_64.tar.bz2 -C $PWD/travis-phantomjs
- export PATH=$PWD/travis-phantomjs/phantomjs-2.1.1-linux-x86_64/bin:$PATH
before_script: make
node_js:
- "10"
- "12"
sudo: required
before_script:
- npm run all
after_success:
- ./scripts/txpush.sh
+25
View File
@@ -0,0 +1,25 @@
[main]
host = https://www.transifex.com
minimum_perc = 1
[id-editor.community]
file_filter = .tx/tmp/community/<lang>.yaml
source_lang = en
type = YAML
[id-editor.core]
file_filter = .tx/tmp/core/<lang>.yaml
source_file = data/core.yaml
source_lang = en
type = YAML
[id-editor.presets]
file_filter = .tx/tmp/presets/<lang>.yaml
source_file = data/presets.yaml
source_lang = en
type = YAML
[id-editor.imagery]
file_filter = .tx/tmp/imagery/<lang>.yaml
source_lang = en
type = YAML
+191 -64
View File
@@ -1,36 +1,76 @@
This file documents efforts toward establishing a public API for iD, one that
can support plugin development.
This file documents efforts toward establishing a public API for iD.
## URL parameters
iD supports several URL parameters. When constructing a URL to a standalone instance
of iD (e.g. `http://openstreetmap.us/iD/release/`), the following parameters are available
in the hash portion of the URL:
##### iD Standalone
* `map` - A slash separated zoom level, longitude, and latitude. Example:
`map=20.00/-77.02271/38.90085`.
* `id` - The character 'n', 'w', or 'r', followed by the OSM ID of a node,
way or relation, respectively. Selects the specified entity, and, unless
a `map` parameter is also provided, centers the map on it.
* `background` - The value from a `sourcetag` property in iD's
[imagery list](https://github.com/openstreetmap/iD/blob/master/data/imagery.json),
iD supports several URL parameters. When constructing a URL to a standalone instance
of iD (e.g. `http://preview.ideditor.com/release/`), the following parameters are available
**in the hash portion of the URL**:
* __`background`__ - The value from a `sourcetag` property in iD's
[imagery list](https://github.com/openstreetmap/iD/blob/develop/data/imagery.json),
or a custom tile URL. A custom URL is specified in the format `custom:<url>`,
where the URL can contain the standard tile URL placeholders `{x}`, `{y}` and
`{z}`/`{zoom}`, `{ty}` for flipped TMS-style Y coordinates, and `{switch:a,b,c}` for
DNS multiplexing. Example:
`background=custom:http://{switch:a,b,c}.tiles.mapbox.com/v4/examples.map-4l7djmvo/{z}/{x}/{y}.png`
* `comment` - Prefills the changeset comment box, for use when integrating iD with
external task management or quality assurance tools. Example:
`comment=CAR%20crisis%2C%20refugee%20areas%20in%20Cameroon%20%23hotosm-task-592`.
DNS multiplexing.<br/>
_Example:_ `background=custom:https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png`
* __`comment`__ - Prefills the changeset comment. Pass a url encoded string.<br/>
_Example:_ `comment=CAR%20crisis%2C%20refugee%20areas%20in%20Cameroon`
* __`disable_features`__ - Disables features in the list.<br/>
_Example:_ `disable_features=water,service_roads,points,paths,boundaries`<br/>
_Available features:_ `points`, `traffic_roads`, `service_roads`, `paths`, `buildings`, `building_parts`, `indoor`, `landuse`,
`boundaries`, `water`, `rail`, `pistes`, `aerialways`, `power`, `past_future`, `others`
* __`gpx`__ - A custom URL for loading a gpx track. Specifying a `gpx` parameter will
automatically enable the gpx layer for display.<br/>
_Example:_ `gpx=https://tasks.hotosm.org/project/592/task/16.gpx`
* __`hashtags`__ - Prefills the changeset hashtags. Pass a url encoded list of event
hashtags separated by commas, semicolons, or spaces. Leading '#' symbols are
optional and will be added automatically. (Note that hashtag-like strings are
automatically detected in the `comment`).<br/>
_Example:_ `hashtags=%23hotosm-task-592,%23MissingMaps`
* __`id`__ - The character 'n', 'w', or 'r', followed by the OSM ID of a node, way or relation, respectively. Selects the specified entity, and, unless a `map` parameter is also provided, centers the map on it.<br/>
_Example:_ `id=n1207480649`
* __`locale`__ - A code specifying the localization to use, affecting the language, layout, and keyboard shortcuts. The default locale is set by the browser.<br/>
_Example:_ `locale=en-US`, `locale=de`<br/>
_Available values:_ Any of the [supported locales](https://github.com/openstreetmap/iD/tree/develop/dist/locales).
* __`map`__ - A slash-separated `zoom/latitude/longitude`.<br/>
_Example:_ `map=20.00/38.90085/-77.02271`
* __`maprules`__ - A path to a [MapRules](https://github.com/radiant-maxar/maprules) service endpoint for enhanced tag validation.<br/>
_Example:_ `maprules=https://path/to/file.json`
* __`offset`__ - Background imagery alignment offset in meters, formatted as `east,north`.<br/>
_Example:_ `offset=-10,5`
* __`photo_overlay`__ - The street-level photo overlay layers to enable.<br/>
_Example:_ `photo_overlay=streetside,mapillary,openstreetcam`<br/>
_Available values:_ `streetside` (Microsoft Bing), `mapillary`, `mapillary-signs`, `mapillary-map-features`, `openstreetcam`
* __`presets`__ - A comma-separated list of preset IDs. These will be the only presets the user may select.<br/>
_Example:_ `presets=building,highway/residential,highway/unclassified`
* __`rtl=true`__ - Force iD into right-to-left mode (useful for testing).
* __`source`__ - Prefills the changeset source. Pass a url encoded string.<br/>
_Example:_ `source=Bing%3BMapillary`
* __`walkthrough=true`__ - Start the walkthrough automatically
##### iD on openstreetmap.org (Rails Port)
When constructing a URL to an instance of iD embedded in the OpenStreetMap Rails
Port (e.g. `http://www.openstreetmap.org/edit?editor=id`), the following parameters
are available as regular URL query parameters:
are available as **regular URL query parameters**:
* `lat`, `lon`, `zoom` - Self-explanatory.
* `node`, `way`, `relation` - Select the specified entity.
* __`map`__ - same as standalone
* __`lat`__, __`lon`__, __`zoom`__ - Self-explanatory.
* __`node`__, __`way`__, __`relation`__ - Select the specified entity.
* __`background`__ - same as standalone
* __`disable_features`__ - same as standalone
* __`gpx`__ - same as standalone
* __`maprules`__ - same as standalone
* __`offset`__ - same as standalone
* __`presets`__ - same as standalone
* __`comment`__ - same as standalone
* __`source`__ - same as standalone
* __`hashtags`__ - same as standalone
* __`locale`__ - same as standalone, but the default locale is set by the language settings in your OSM user account.
* __`walkthrough`__ - same as standalone
In addition, the `background` parameter is available as a hash parameter as above.
## CSS selectors
@@ -41,7 +81,7 @@ vocabulary established by iD, and to the tags present on OSM entities.
### OSM Data Model classes
An SVG element on the map to which an iD.Entity has been bound as a datum shall
An SVG element on the map to which an iD.osmEntity has been bound as a datum shall
have a class with that datum's type, i.e. either `.node` or `.way`. (If and when
we add visual representations for relations, `.relation` may also be valid.)
@@ -74,7 +114,7 @@ A **line** is a way that is not an area. Elements representing lines have a `.li
class. Since a line is also a way, they also have a `.way` class.
An **area** is a way that is circular, has certain tags, or lacks certain other
tags (see `iD.Way#isArea` for the exact definition). Elements representing areas
tags (see `iD.osmWay#isArea` for the exact definition). Elements representing areas
have `.area` and `.way` classes.
@@ -83,7 +123,7 @@ have `.area` and `.way` classes.
Elements also receive classes according to certain of the OSM key-value tags that are
assigned to them.
Tag classes are prefixed with `tag-` (see [`iD.svg.TagClasses`](https://github.com/openstreetmap/iD/blob/master/js/id/svg/tag_classes.js) for details).
Tag classes are prefixed with `tag-` (see [`iD.svgTagClasses`](https://github.com/openstreetmap/iD/blob/develop/js/id/svg/tag_classes.js) for details).
#### Primary
@@ -112,74 +152,161 @@ indicating a bumpy surface.
### Special classes
A node that is a member of two or more ways shall have the `.shared` class.
- A node that is a member of two or more ways shall have the `.shared` class.
Two or more nodes at identical coordinates shall each have an `.overlapped` class. (TODO)
- A node that is an endpoint of a linear way shall have the `.endpoint` class.
Elements comprising the entity currently under the cursor shall have the `.hover` class.
- Two or more nodes at identical coordinates shall each have an `.overlapped` class. (TODO)
- Elements comprising the entity currently under the cursor shall have the `.hover` class.
(The `:hover` psuedo-class is insufficient when an entity's visual representation consists
of several elements, only one of which can be `:hover`ed.)
Elements that are currently active (being clicked or dragged) shall have the `.active`
- Elements that are currently active (being clicked or dragged) shall have the `.active`
class.
Elements that are currently selected shall have the `.selected` class.
- Elements that are currently selected shall have the `.selected` class.
## Customized Deployments
iD is used to edit data outside of the OpenStreetMap environment. There are some basic configuration steps to introduce custom presets, imagery and tag information.
iD may be used to edit maps in a non-OpenStreetMap environment. This requires
certain parts of the iD code to be replaced at runtime by custom code or data.
iD is written in a modular style and bundled with [rollup.js](http://rollupjs.org/),
which makes hot code replacement tricky. (ES6 module exports are
[immutable live bindings](http://www.2ality.com/2015/07/es6-module-exports.html)).
Because of this, the parts of iD which are designed for customization are exported
as live bound objects that can be overriden at runtime _before initializing the iD context_.
### Services
The `iD.services` object includes code that talks to other web services.
To replace the OSM service with a custom service that exactly mimics the default OSM service:
```js
iD.services.osm = serviceMyOSM;
```
Some services may be removed entirely. For example, to remove the Mapillary service:
```js
iD.services.mapillary = undefined;
// or
delete iD.services.mapillary;
```
### Background Imagery
iD's background imagery database is stored in the `iD.fileFetcher.cache().imagery` array and can be
overridden or modified prior to creating the iD context.
Note that the "None" and "Custom" options will always be shown in the list.
To remove all imagery from iD:
```js
iD.fileFetcher.cache().imagery = [];
```
To replace all imagery with a single source:
```js
iD.fileFetcher.cache().imagery = [{
"id": "ExampleImagery",
"name": "My Imagery",
"type": "tms",
"template": "http://{switch:a,b,c}.tiles.example.com/{z}/{x}/{y}.png"
}];
```
Each imagery source should have the following properties:
* `id` - Unique identifier for this source (also used as a url paramater)
* `name` - Display name for the source
* `type` - Source type, currently only `tms` is supported
* `template` - Url template, valid replacement tokens include:
* `{z}`, `{x}`, `{y}` - for Z/X/Y scheme
* `{-y}` or `{ty}` - for flipped Y
* `{u}` - for quadtile scheme
* `{switch:a,b,c}` - for parts of the url that can be cycled for connection parallelization
Optional properties:
* `description` - A longer source description which, if included, will be displayed in a popup when viewing the background imagery list
* `overlay` - If `true`, this is an overlay layer (a transparent layer rendered above base imagery layer). Defaults to `false`
* `zoomExtent` - Allowable min and max zoom levels, defaults to `[0, 22]`
* `polygon` - Array of coordinate rings within which imagery is valid. If omitted, imagery is assumed to be valid worldwide
* `overzoom` - Can this imagery be scaled up when zooming in beyond the max zoom? Defaults to `true`
* `terms_url` - Url to link to when displaying the imagery terms
* `terms_html` - Html content to display in the imagery terms
* `terms_text` - Text content to display in the imagery terms
* `best` - If set to `true`, this imagery is considered "better than Bing" and may be chosen by default when iD starts. Will display with a star in the background imagery list. Defaults to `false`
For more details about the `iD.fileFetcher.cache().imagery` structure, see
[`update_imagery.js`](https://github.com/openstreetmap/iD/blob/develop/scripts/update_imagery.js).
### Presets
iD can use external presets exclusively or along with the default OpenStreetMap presets. This is configured using the `iD().presets` accessor. To use external presets alone, initialize iD in index.html with the Presets object.
iD's preset database is stored in the `iD.fileFetcher.cache().presets` object and can be overridden
or modified prior to creating the iD context.
The format of the `presets` object is
[documented here](https://github.com/openstreetmap/iD/tree/develop/data/presets#custom-presets).
To add a new preset to iD's existing preset database.
```js
var iD = iD()
.presets(customPresets)
.taginfo(iD.services.taginfo())
.imagery(iD.data.imagery);
iD.fileFetcher.cache().presets.presets["aerialway/zipline"] = {
geometry: ["line"],
fields: ["incline"],
tags: { "aerialway": "zip_line" },
name: "Zipline"
};
```
The format of the Preset object is [documented here](https://github.com/openstreetmap/iD/tree/master/data/presets#custom-presets).
### Imagery
Just like Presets, Imagery can be configured using the `iD().imagery` accessor.
To completely replace iD's default presets with your own:
```js
var iD = iD()
.presets(customPresets)
.taginfo(iD.services.taginfo())
.imagery(customImagery);
iD.fileFetcher.cache().presets = myPresets;
```
The Imagery object should follow the structure defined by [editor-layer-index](https://github.com/osmlab/editor-layer-index/blob/gh-pages/schema.json)
### Taginfo
[Taginfo](http://taginfo.openstreetmap.org/) is a service that provides comprehensive documentation about the tags used in OpenStreetMap. iD uses Taginfo to display description and also autocomplete keys and values. This can be completely disabled by removing the `iD().taginfo` accessor. To point iD to a different instance of Taginfo other than the default OpenStreetMap instance
To run iD with the minimal set of presets that only match basic geometry types:
```js
var iD = iD()
.presets(customPresets)
.taginfo(iD.services.taginfo().endpoint('url'))
.imagery(customImagery);
iD.fileFetcher.cache().presets = {
presets: {
"area": {
"name": "Area",
"tags": {},
"geometry": ["area"]
},
"line": {
"name": "Line",
"tags": {},
"geometry": ["line"]
},
"point": {
"name": "Point",
"tags": {},
"geometry": ["point"]
},
"vertex": {
"name": "Vertex",
"tags": {},
"geometry": ["vertex"]
},
"relation": {
"name": "Relation",
"tags": {},
"geometry": ["relation"]
}
}
};
```
### Minimum Editable Zoom
The minimum zoom at which iD enters the edit mode is configured using the `iD().minEditableZoom()` accessor. The default value is 16. To change this initialise iD as
The minimum zoom at which iD enters the edit mode is configured using the `context.minEditableZoom()` accessor. The default value is 16. To change this initialise the iD context as:
```js
var iD = iD().
var id = iD.coreContext()
.minEditableZoom(zoom_level)
```
+280 -103
View File
@@ -1,59 +1,73 @@
## d3
## iD Architecture
iD is written in a modular code style using ES6 modules. The modules are bundled
with [rollup.js](http://rollupjs.org/). iD eventually aims to be a reusable,
modular library to kickstart other JavaScript-based tools for OpenStreetMap.
### d3
[d3](http://d3js.org/) is the primary library used by iD. It is used for
rendering the map data as well as many sorts of general DOM manipulation tasks
for which jQuery would often be used.
Notable features of d3 that are used by iD include
[d3.xhr](https://github.com/mbostock/d3/wiki/Requests#wiki-d3_xhr), which is
used to make the API requests to download data from openstreetmap.org and save
changes;
[d3.dispatch](https://github.com/mbostock/d3/wiki/Internals#wiki-d3_dispatch),
[d3.fetch](https://github.com/d3/d3/blob/develop/API.md#fetches-d3-fetch), which is
used to make the API requests to download data from openstreetmap.org and save changes;
[d3.dispatch](https://github.com/d3/d3/blob/develop/API.md#dispatches-d3-dispatch),
which provides a callback-based [Observer
pattern](http://en.wikipedia.org/wiki/Observer_pattern) between different
parts of iD;
[d3.geo.path](https://github.com/mbostock/d3/wiki/Geo-Paths#wiki-path), which
[d3.geoPath](https://github.com/d3/d3/blob/develop/API.md#paths), which
generates SVG paths for lines and areas; and
[d3.behavior.zoom](https://github.com/mbostock/d3/wiki/Zoom-Behavior#wiki-zoom),
[d3.zoom](https://github.com/d3/d3/blob/develop/API.md#zooming-d3-zoom),
which implements map panning and zooming.
## Core
The iD *core* implements OSM data types, a graph of OSM objects'
relationships to one another, an undo/redo history for changes made during
editing, and a couple of important auxiliary classes. It eventually aims
to be a reusable, modular library to kickstart other JavaScript-based
tools for OpenStreetMap.
### Core Module
The OSM data model includes three basic data types: nodes, ways, and
relations.
The iD *core* module implements the basic datastructures needed to support
browser-based editing:
* A _node_ is a point type, having a single geographic coordinate.
* A _way_ is an ordered list of nodes.
* A _relation_ groups together nodes, ways, and other relations to provide
* `iD.coreContext` - container for all iD "global" objects and bootstrap code
* `iD.coreGraph` - graph of objects and their relationships to one another
* `iD.coreHistory` - undo/redo history for changes made during editing
* `iD.coreDifference` - efficiently determine the difference between two graphs
* `iD.coreTree` - performs fast spatial indexing of the loaded objects
### OSM Module
The iD *osm* module includes classes which represent the basic OpenStreetMap
objects: nodes, ways, and relations.
* `iD.osmNode` - a _node_ is a point type, having a single geographic coordinate
* `iD.osmWay` - a _way_ is an ordered list of nodes
* `iD.osmRelation` - a _relation_ groups together nodes, ways, and other relations to provide
free-form higher-level structures.
Each of these three types has _tags_: an associative array of key-value pairs which
Each of these three types has _tags_: an associative array of key-value pairs which
describe the object.
In iD, these three types are implemented by `iD.Node`, `iD.Way` and
`iD.Relation`. These three classes inherit from a common base, `iD.Entity`.
* `iD.osmEntity` - common base class for `iD.osmNode`, `iD.osmWay`, `iD.osmRelation`
These three classes inherit from a common base, `iD.osmEntity`.
This is the only use of classical inheritance in iD, but it's justified
by the common functionality of the types. Generically, we refer to a
by the common functionality of the types. Generically, we refer to a
node, way or relation as an _entity_.
Every entity has an _ID_ either assigned by the OSM database or
a negative, local identifier assigned by iD for newly-created objects.
IDs from the OSM database as treated as opaque strings; no
Every entity has a unique numeric `id`. By convention, positive numbers are
assigned by the OSM database for saved features, and negative numbers are
assigned by the iD editor for local newly-created objects.
`id` values from the OSM database as treated as opaque strings; no
[assumptions](http://lists.openstreetmap.org/pipermail/dev/2013-February/026495.html)
are made of them other than that they can be compared for identity and do not
begin with a minus sign (and thus will not conflict with proxy IDs). The three
types of entities have separate ID spaces: a
node can have the same numeric ID as a way or a relation. Instead of segregating
ways, nodes, and other entities into different datastructures,
iD internally uses fully-unique IDs generated by prefixing
each OSM ID with the first letter of the entity type. For example, a way
with OSM ID 123456 is represented as 'w123456' within iD.
begin with a minus sign (and thus will not conflict with local `id` values).
The three types of entities have separate `id` spaces: a node can have the
same numeric `id` as a way or a relation. Instead of segregating ways, nodes,
and other entities into different datastructures, iD internally uses fully-unique
`id` values generated by prefixing each OSM ID with the first letter of the entity
type. For example, a way with OSM `id` `123456` is represented as `w123456`
within iD.
iD entities are *immutable*: once constructed, an `Entity` object cannot
change. Tags cannot be updated; nodes cannot be added or removed from ways,
@@ -66,19 +80,30 @@ structure](http://en.wikipedia.org/wiki/Persistent_data_structure).
Since iD is an editor, it must allow for new versions of entities. The
solution is that all edits produce new copies of anything that changes. At the
entity level, this takes the form of methods such as `iD.Node#move`, which
returns a new node object that has the same ID and tags as the original, but a
different coordinate. More generically, `iD.Entity#update` returns a new
entity of the same type and ID as the original but with specified properties
entity level, this takes the form of methods such as `iD.osmNode#move`, which
returns a new node object that has the same `id` and `tags` as the original, but a
different `loc` coordinate. More generically, `iD.osmEntity#update` returns
a new entity of the same type and `id` as the original but with specified properties
such as `nodes`, `tags`, or `members` replaced.
![](http://farm9.staticflickr.com/8087/8508309757_ccf5b6f09b_o.png)
Entities are related to one another: ways have many nodes and relations have
many members. To render a map of a certain area, iD needs a
many members.
The osm module also includes code related to special kinds of objects in OpenStreetMap.
* `iD.osmIntersection` - code for working with turn restrictions
* `iD.osmLanes` - code for working with traffic and turn lanes
* `iD.osmMultipolygon` - code for working with multipolygon relations
### Editing OSM
To render a map of a certain area, iD needs a
datastructure to hold all the entities in that area and traverse these
relationships. `iD.Graph` provides this functionality. The core of a graph is
a map between IDs and the associated entities; given an ID, the graph can give
relationships. `iD.coreGraph` provides this functionality. The core of a graph is
a map between `id`s and the associated entities; given an `id`, the graph can give
you the entity. Like entities, a graph is immutable: adding, replacing, or
removing an entity produces a new graph, and the original is unchanged.
Because entities are immutable, the original and new graphs can minimize
@@ -87,7 +112,7 @@ copying the entire graph.
This persistent data structure approach is similar to the internals of
the [git](http://git-scm.com/) revision control system.
The final major component of the core is `iD.History`, which tracks the changes
The final major component of the core is `iD.coreHistory`, which tracks the changes
made in an editing session and provides undo/redo capabilities. Here, the
immutable nature of the core types really pays off: the history is a simple
stack of graphs, each representing the state of the data at a particular point
@@ -102,48 +127,48 @@ Instead of changing a single copy of local data and having to implement
an 'undo' for each specific action, actions in iD do not need to be aware
of history and the undo system.
Finally, we have the auxiliary classes `iD.Difference` and `iD.Tree`.
Finally, we have the auxiliary classes `iD.coreDifference` and `iD.coreTree`.
`iD.Difference` encapsulates the difference between two graphs, and knows how to calculate the
`iD.coreDifference` encapsulates the difference between two graphs, and knows how to calculate the
set of entities that were created, modified, or deleted, and need to be redrawn.
```js
var a = iD.Graph(), b = iD.Graph();
var a = iD.coreGraph(), b = iD.coreGraph();
// (fill a & b with data)
var difference = iD.Difference(a, b);
var difference = iD.coreDifference(a, b);
// returns entities created between and b
// returns entities created between a and b
difference.created();
```
`iD.Tree` calculates the set of downloaded entities that are visible in the
`iD.coreTree` calculates the set of downloaded entities that are visible in the
current map view. To calculate this quickly during map
interaction, it uses an [R-tree](http://en.wikipedia.org/wiki/R-tree).
```js
var graph = iD.Graph();
var graph = iD.coreGraph();
// (load OSM data into graph)
// this tree indexes the contents of the graph
var tree = iD.Tree(graph);
var tree = iD.coreTree(graph);
// quickly pull all features that intersect with an extent
var features = tree.intersects(
iD.geo.Extent([0, 0], [2, 2]), tree.graph());
iD.geoExtent([0, 0], [2, 2]), tree.graph());
```
## Actions
### Actions Module
In iD, an _action_ is a function that accepts a graph as input and returns a
new, modified graph as output. Actions typically need other inputs as well; for
example, `iD.actions.DeleteNode` also requires the ID of a node to delete. The
example, `iD.actionDeleteNode` also requires the `id` of a node to delete. The
additional input is passed to the action's constructor:
```js
// construct the action: this returns a function that remembers the
// value `n123456` in a closure so that when it's called, it runs
// the specified action on the graph
var action = iD.actions.DeleteNode('n123456');
var action = iD.actionDeleteNode('n123456');
// apply the action, yielding a new graph. oldGraph is untouched.
newGraph = action(oldGraph);
@@ -165,10 +190,10 @@ knowledge of the OpenStreetMap data model. It is our hope that JavaScript
based tools for OpenStreetMap can reuse the iD's core implementation,
significantly reducing the work necessary to create a robust tool.
## Modes
### Modes Module
With _modes_, we shift gears from abstract data types and algorithms to the
parts of the architecture that implement the user interface for iD. Modes are
parts of the architecture that implement the user interface for iD. Modes are
manifested in the interface by the three buttons at the top left:
![Mode buttons](docs/img/modes.png)
@@ -184,10 +209,10 @@ around the map and select and edit entities, and three geometrically-oriented
drawing modes, which are accessible through the mode buttons in the upper
toolbar: Point, Line, and Area. In the code, these are broken down a
little bit more. There are separate modes for when an entity is selected
(`iD.modes.Select`) versus when nothing is selected (`iD.modes.Browse`), and
(`iD.modeSelect`) versus when nothing is selected (`iD.modeBrowse`), and
each of the geometric modes is split into one mode for starting to draw an
object and one mode for continuing an existing object (with the exception of
`iD.modes.AddPoint`, which is a single-step operation for obvious reasons).
`iD.modeAddPoint`, which is a single-step operation for obvious reasons).
The code interface for each mode consists of a pair of methods: `enter` and
`exit`. In the `enter` method, a mode sets up all the behavior that should be
@@ -199,16 +224,16 @@ The `exit` mode does the opposite, removing the behavior installed by the
and exclusive: each mode knows exactly the behavior that is specific to that
mode, and exactly one mode's behavior is active at any time.
## Behavior
### Behavior Module
Certain behaviors are common to more than one mode. For example, iD indicates
interactive map elements by drawing a halo around them when you hover over
them, and this behavior is common to both the browse and draw modes. Instead
of duplicating the code to implement this behavior in all these modes, we
extract it to `iD.behavior.Hover`.
extract it to `iD.behaviorHover`.
_Behaviors_ take their inspiration from [d3's
behaviors](https://github.com/mbostock/d3/wiki/Behaviors). Like d3's `zoom`
behaviors](https://github.com/d3/d3/blob/develop/API.md). Like d3's `zoom`
and `drag`, each iD behavior is a function that takes as input a d3 selection
(assumed to consist of a single element) and installs the DOM event bindings
necessary to implement the behavior. The `Hover` behavior, for example,
@@ -223,12 +248,12 @@ Each behavior implements an `off` function that "uninstalls" the behavior.
This is very similar to the `exit` method of a mode, and in fact many modes do
little else but uninstall behaviors in their `exit` methods.
## Operations
### Operations Module
_Operations_ wrap actions, providing their user-interface: tooltips, key
bindings, and the logic that determines whether an action can be validly
performed given the current map state and selection. Each operation is
constructed with the list of IDs which are currently selected and a `context`
constructed with the list of `id`s which are currently selected and a `context`
object which provides access to the history and other important parts of iD's
internal state. After being constructed, an operation can be queried as to
whether or not it should be made available (i.e., show up in the context menu)
@@ -247,14 +272,14 @@ conditions under which it is enabled.
To execute an operation, call it as a function, with no arguments. The typical
operation will perform the appropriate action, creating a new undo state in
the history, and then enter the appropriate mode. For example,
`iD.operations.Split` performs `iD.actions.Split`, then enters
`iD.modes.Select` with the resulting ways selected.
`iD.operationSplit` performs `iD.actionSplit`, then enters
`iD.modeSelect` with the resulting ways selected.
## Map Rendering
### Renderer and SVG Modules
Finally, we get to the parts of iD that actually draw and manipulate the map
entities on screen. The rendering is coordinated by `iD.Map`, which takes care
of setting up a [Spherical Mercator](http://bl.ocks.org/mbostock/3757132)
entities on screen. The rendering is coordinated by `iD.rendererMap`, which
takes care of setting up a [Spherical Mercator](http://bl.ocks.org/mbostock/3757132)
projection and the [zoom
behavior](https://github.com/mbostock/d3/wiki/Zoom-Behavior), and provides
accessors for such things as the current zoom level and map center.
@@ -270,8 +295,8 @@ entity types of the OSM data model:
or more ways grouped in a multipolygon relation.
For each of these geometric types, `iD.svg` has a corresponding module:
`iD.svg.Points`, `iD.svg.Vertices`, `iD.svg.Lines`, and `iD.svg.Areas`. To
render entities on screen, `iD.Map` delegates to these modules. Internally,
`iD.svgPoints`, `iD.svgVertices`, `iD.svgLines`, and `iD.svgAreas`. To
render entities on screen, `iD.rendererMap` delegates to these modules. Internally,
they make heavy use of [d3 joins](http://bost.ocks.org/mike/join/) to
manipulate the SVG elements that visually represent the map entities. When an
entity is rendered for the first time, it is part of the _enter_ selection,
@@ -282,60 +307,51 @@ are updated. And when an entity is deleted (or simply moves offscreen), the
corresponding SVG element is in the _exit_ selection, and will be removed.
The `iD.svg` modules apply classes to the SVG elements based on the entity
tags, via `iD.svg.TagClasses`. For example, an entity tagged with
tags, via `iD.svgTagClasses`. For example, an entity tagged with
`highway=residential` gets two classes: `tag-highway` and
`tag-highway-residential`. This allows distinct visual styles to be applied
via CSS at either the key or key-value levels. SVG elements also receive a
class corresponding to their entity type (`node`, `way`, or `relation`) and
one corresponding to their geometry type (`point`, `line`, or `area`).
The `iD.svg` namespace has a few other modules that don't have a one-to-one
The `iD.svg` module has a few other submodules that don't have a one-to-one
correspondence with entities:
* `iD.svg.Midpoints` renders the small "virtual node" at the midpoint between
* `iD.svgMidpoints` - draws the small "virtual node" at the midpoint between
two vertices.
* `iD.svg.Labels` renders the textual
[labels](http://mapbox.com/osmdev/2013/02/12/labeling-id/).
* `iD.svg.Layers` sets up a number of layers that ensure that map elements
* `iD.svgLabels` - draws textual labels
* `iD.svgLayers` - sets up a number of layers that ensure that map elements
appear in an appropriate z-order.
* `iD.svgOsm` - sets up the OSM-specific data layers
* `iD.svgData` - draws any other overlaid vector data (gpx, kml, geojson, mvt, pbf)
* `iD.svgDebug` - draws debugging information
## Other UI
### Other UI
iD provides a lot of user interface elements other than the core map component:
the page footer, the interface for saving changes, the splash screen you see
the first time you use iD, the geocoding and background layer controls, and the
tag/preset editor, for example.
the first time you use iD, the map controls, and the tag/preset editor, for example.
![Geocoder UI](docs/img/geocoder.png)
The implementations for all non-map UI components live in the `iD.ui` namespace.
Many of the modules in this namespace follow a pattern for reusable d3
The implementations for all non-map UI components live in the `iD.ui` module.
Many of the submodules under the `ui` module follow a pattern for reusable d3
components [originally suggested](http://bost.ocks.org/mike/chart/) by Mike
Bostock in the context of charts. The entry point to a UI element is a
constructor function, e.g. `iD.ui.Geocoder()`. The constructor function may
Bostock in the context of charts. The entry point to a UI element is a
constructor function, e.g. `iD.uiViewOnOSM()`. The constructor function may
require a set of mandatory arguments; for most UI components exactly one
argument is required, a `context` object produced by the top-level `iD()`
function.
argument is required, a `context`.
A component needs some way to be rendered on screen by creating new DOM
elements or manipulating existing elements. This is done by calling the
component as a function, and passing a d3 selection where the component should
render itself:
The constructor function returns a draw function which accepts a d3 selection.
Drawing is then accomplished with
[d3.selection#call](https://github.com/d3/d3-selection/blob/develop/README.md#selection_call):
```
var container = d3.select('body').append('div')
.attr('class', 'map-control geocode-control');
```js
footer = footer.enter()
.append('div')
.attr('class', 'footer')
.merge(footer);
var geocoder = iD.ui.Geocoder(context)(container);
```
Alternatively, and more commonly, the same result is accomplished with
[d3.selection#call](https://github.com/mbostock/d3/wiki/Selections#wiki-call):
```
d3.select('body').append('div')
.attr('class', 'map-control geocode-control')
.call(iD.ui.Geocoder(context));
footer
.call(uiViewOnOSM(context).what(entity));
```
Some components are reconfigurable, and some provide functionality beyond
@@ -343,8 +359,169 @@ basic rendering. Both reconfiguration and extended functionality are exposed
via module functions:
```
var inspector = iD.ui.Inspector();
var inspector = iD.uiInspector();
inspector(container); // render the inspector
inspector.tags(); // retrieve the current tags
inspector.on('change', callback); // get notified when a tag change is made
```
### Validation Module
Runtime data validation in iD is managed by `coreValidator`.
#### Issue Severities
"Issue" is the general term for anything noted by the validator. Issues are further categorized by severity.
##### `error`
_Red._ Errors are the most severe issues. The user must resolve all errors before uploading their changes. Thus, these should be straightforward to fix and there should be virtually no false positives.
##### `warning`
_Yellow._ Warnings are general issues that the user is free to ignore. They have varying degrees of importance, accuracy, and fixability. Still, only clear and relevant warnings should be shown to avoid overwhelming the user. Most issues are warnings.
#### Validation Rules
A validation rule is an object that takes an entity and a graph and returns objects of type `validationIssue` representing problems found with that entity for that graph. Rules are listed under `modules/validations` and correspond directly to the toggleable Rules list under the Issues pane in iD's UI.
Each `validationIssue` takes its rule's `type` and may include a `subtype` that further differentiates it.
#### Issue Types
##### `almost_junction`
A way ends close to another way, indicating they should likely be connected. The current distance threshold is 5 meters.
* `highway-highway`: both the ways are roads or paths; no issue is flagged if the endpoint is an entrance or is tagged `noexit=yes`
##### `close_nodes`
Two nodes have a very small distance between them. The threshold distance is smaller for features expected to be mapped at higher levels of detail (e.g. paths, rooms).
* `detached`: the nodes are not part of any ways; close points with differing z-axis tags like `layer` and `level` are not flagged
* `vertices`: the nodes are adjacent members of a way
##### `crossing_ways`
Two ways cross without a junction node or enough information to clarify how they cross.
Building crossings are flagged per-feature. Other subtypes are flagged per-crossing.
* `building-building`
* `building-highway`
* `building-railway`
* `building-waterway`
* `highway-highway`
* `highway-railway`
* `highway-waterway`
* `railway-railway`
* `railway-waterway`
* `waterway-waterway`
##### `disconnected_way`
One or more interconnected, routable feature are not connected to the rest of the routable network (i.e. they form a routing island). A way is considered connected to the network if any of its nodes are on an unloaded tile, meaning large routing islands may not always be detected.
* `highway`: the feature is a road, path, ferry route, or elevator; entrances are also considered network connections
##### `help_request`
Someone has indicated a feature needs further attention.
* `fixme_tag`: a feature has a `fixme` tag that existed before the user's current edits; deleting the `fixme` tag marks the issue as resolved regardless of the user's other edits
##### `impossible_oneway`
A one-way line does not have a valid connection at its first or last node.
* `highway`: a one-way road or path does not start or end at another highway or an entrance
* `waterway`: multiple streams, etc., start or end at the same node that's not a spring, drain, or water body
##### `incompatible_source`
The `source` tag of a feature references a data source known to have a license incompatiable with OpenStreetMap. This is very much not exhaustive and currently only flags sources containing "google".
##### `invalid_format`
A tag of a feature has an unexpected syntax.
* `email`: the `email` tag does not look like "user@example.com"
##### `maprules`
An issue with the active [MapRules](https://github.com/radiant-maxar/maprules) validation rules.
##### `mismatched_geometry`
A feature's tags indicate it should have a different geometry than it currently does.
* `area_as_line`: an unclosed way has tags implying it should be a closed area (e.g. `area=yes` or `building=yes`)
* `vertex_as_point`: a detached node has tags implying it should be part of a way (e.g. `highway=stop`)
* `point_as_vertex`: a vertex node has tags implying it should be detached from ways (e.g. `amenity=cafe`)
* `unclosed_multipolygon_part`: a relation is tagged as a multipolygon but not all of its member ways form closed rings
##### `missing_role`
A relation membership does not have a set `role`.
##### `missing_tag`
A feature does not have enough tags to define what it is.
* `any`: there are zero tags
* `descriptive`: there are `area`, `name`, `type=multipolygon`, and/or meta tags (e.g. `source`), but no defining tags
* `relation_type`: the OSM entity type is `relation` but there is no `type` tag
* `highway_classification`: the OSM entity type is `way` and the feature is tagged as `highway=road`
##### `outdated_tags`
A feature has nonstandard tags.
* `deprecated_tags`: the feature has tags that should be replaced or removed, as specified in `deprecated.json` or the `replacement` property of a preset
* `incomplete_tags`: the feature has tags that indicate it should also have some other tags
* `noncanonical_brand`: the feature indicates it should match a name-suggestion-index entry but does not have all of the given tags
* `old_multipolygon`: the feature is a multipolygon relation with its defining tags set on its outer member way
##### `private_data`
An email address, phone number, or fax number is present on a residential feature that isn't also tagged as a POI.
##### `suspicious_name`
There's indication that a `name` tag doesn't contain the actual name of the feature. Multilingual names like `name:de` are also checked.
* `generic_name`: a name matches the raw key or value of the feature's defining tags (e.g. `amenity`, `cafe`) or it matches something the name-suggestion-index discards as generic when checking the most common place names in OpenStreetMap
* `not_name`: a name tag matches a value under the `not:name` tag
##### `unsquare_way`
A way has corners close to, but not quite 90°. The user can vary the "close to" degree threshold between 0° and 20°. The default is 5°. Only buildings are currently flagged.
* `building`: the feature has a `building` tag
#### Issue Changeset Tags
To assist data reviewers, tags indicating the number and type of issues created and resolved via the user's edits are included in the changeset tags.
These counts are tied to issues and not features, so edits to a single feature could both create and resolve issues while leaving still others unchanged.
These tags cannot be manually removed or altered by the user—for example, by disabling rules or ignoring issues. One exception to this is that the user can change the `unsquare_way` degree threshold.
The format is: `{warnings|resolved}:{type}:{subtype}={count}`
Note that specific `type` and `subtype` IDs could change or vary slightly in meaning between different versions of iD.
##### `warnings`
The `warnings` namespace indicates issues that were created and ignored by the user. These must all be issues of severity `warning` and not `error` since errors block upload altogether and thus cannot be ignored.
Prior to iD 2.16.0, these also included any warnings concerning features edited by the user, even if they weren't created via the user's edits.
e.g. `warnings:disconnected_way:highway=4`
##### `resolved`
The `resolved` namespace indicates issues of any kind that were fixed by the user. A resolved issue did not necessarily appear under `warnings` in some previous OSM changeset.
e.g. `resolved:crossing_ways:building-highway=2`
+5001 -97
View File
File diff suppressed because it is too large Load Diff
+297 -62
View File
@@ -3,11 +3,13 @@
Thinking of contributing to iD? High five! Here are some basics for our habits
so that you can write code that fits in perfectly.
## Code of Conduct
We want everyone to feel comfortable contributing to iD. Please read the project
[Code of Conduct](CODE_OF_CONDUCT.md) and remember to be nice to one another.
## Reporting Issues
We'd love to hear what you think about iD, about any specific problems or
@@ -17,15 +19,16 @@ Please [search for your issue before filing it: many bugs and improvements have
To report a bug:
* Write specifically what browser (type and version, like "Firefox 43.0"), OS,
* Write specifically what browser (type and version, like "Firefox 49.0"), OS,
and browser extensions you have installed
* Write steps to replicate the error: when did it happen? What did you expect to happen?
What happened instead?
* We love screenshots. If you can take a picture of the issue, that is extra helpful.
You can drag the image file onto the GitHub issue and it will be included with your bug report.
* You can use a program like [LICEcap](http://www.cockos.com/licecap/) to record an animated gif.
* Please keep bug reports professional and straightforward: trust us, we share your dismay at software breaking.
* If you can, [enable web developer extensions](http://debugbrowser.com/) and report the
Javascript error message.
JavaScript error message.
When in doubt, be over-descriptive of the bug and how you discovered it.
@@ -36,23 +39,172 @@ To request a feature:
* Understand that iD is meant to be a simple editor and doesn't aim to be
as complete or complicated as JOSM or similar.
## Issue Labels
We use GitHub labels to keep track of issues. Some guidelines:
Green labels are for **action items**. Jump in and start working!
* <sub>[![good-first-issue][good-first-issue]][good-first-issue_link]</sub> -
Best for new contributors. No experience necessary!
* <sub>[![help-wanted][help-wanted]][help-wanted_link]</sub> -
For more intermediate contributors, probably requires investigation or knowledge of iD code.
* <sub>[![priority][priority]][priority_link]</sub> -
Issues that have a big impact or matter most to _new mappers_.
<br/>(There should probably be 10 or fewer "priority" items.)
[good-first-issue]: http://labl.es/svg?text=good%20first%20issue&bgcolor=0e8a16
[help-wanted]: http://labl.es/svg?text=help%20wanted&bgcolor=0e8a16
[priority]: http://labl.es/svg?text=priority&bgcolor=0e8a16
[good-first-issue_link]: https://github.com/openstreetmap/iD/issues?q=is%3Aopen+is%3Aissue+label%3A%22good%20first%20issue%22
[help-wanted_link]: https://github.com/openstreetmap/iD/issues?q=is%3Aopen+is%3Aissue+label%3A%22help%20wanted%22
[priority_link]: https://github.com/openstreetmap/iD/issues?q=is%3Aopen+is%3Aissue+label%3Apriority
Red labels are for **bugs**. These are things that we want fixed, but might be a bit more
complicated than the green action items.
* <sub>[![bug][bug]][bug_link]
[![bug-release-blocker][bug-release-blocker]][bug-release-blocker_link]
[![bug-browser-specific][bug-browser-specific]][bug-browser-specific_link]</sub>
[bug]: http://labl.es/svg?text=bug&bgcolor=d93f0b
[bug-release-blocker]: http://labl.es/svg?text=bug-release-blocker&bgcolor=d93f0b
[bug-browser-specific]: http://labl.es/svg?text=bug-browser-specific&bgcolor=d93f0b
[bug_link]: https://github.com/openstreetmap/iD/issues?q=is%3Aopen+is%3Aissue+label%3Abug
[bug-release-blocker_link]: https://github.com/openstreetmap/iD/issues?q=is%3Aopen+is%3Aissue+label%3Abug-release-blocker
[bug-browser-specific_link]: https://github.com/openstreetmap/iD/issues?q=is%3Aopen+is%3Aissue+label%3Abug-browser-specific
Purple labels are for **non-action items**. These might be a question or feature request
that needs some discussion about whether it belongs in iD. Discuss before working on these.
* <sub>[![considering][considering]][considering_link]
[![question][question]][question_link]</sub>
[considering]: http://labl.es/svg?text=considering&bgcolor=cc33cc
[question]: http://labl.es/svg?text=question&bgcolor=cc33cc
[considering_link]: https://github.com/openstreetmap/iD/issues?q=is%3Aopen+is%3Aissue+label%3Aconsidering
[question_link]: https://github.com/openstreetmap/iD/issues?q=is%3Aopen+is%3Aissue+label%3Aquestion
Yellow labels are for **chores**. These are the things like code cleanup, upgrades, tests,
documentation, repository gardening, and other stuff that makes developers happy.
* <sub>[![chore][chore]][chore_link]
[![chore-dependency][chore-dependency]][chore-dependency_link]
[![chore-documentation][chore-documentation]][chore-documentation_link]
[![chore-greenkeeper][chore-greenkeeper]][chore-greenkeeper_link]</sub>
[chore]: http://labl.es/svg?text=chore&bgcolor=fef2c0
[chore-dependency]: http://labl.es/svg?text=chore-dependency&bgcolor=fef2c0
[chore-documentation]: http://labl.es/svg?text=chore-documentation&bgcolor=fef2c0
[chore-greenkeeper]: http://labl.es/svg?text=chore-greenkeeper&bgcolor=fef2c0
[chore_link]: https://github.com/openstreetmap/iD/issues?q=is%3Aopen+is%3Aissue+label%3Achore
[chore-dependency_link]: https://github.com/openstreetmap/iD/issues?q=is%3Aopen+is%3Aissue+label%3Achore-dependency
[chore-documentation_link]: https://github.com/openstreetmap/iD/issues?q=is%3Aopen+is%3Aissue+label%3Achore-documentation
[chore-greenkeeper_link]: https://github.com/openstreetmap/iD/issues?q=is%3Aopen+is%3Aissue+label%3Achore-greenkeeper
Light blue labels are for **features**. We use labels to group them into categories.
* <sub>[![core][core]][core_link]
[![localization][localization]][localization_link]
[![performance][performance]][performance_link]
[![preset][preset]][preset_link]
[![renderer][renderer]][renderer_link]
[![validation][validation]][validation_link]</sub>
[core]: http://labl.es/svg?text=core&bgcolor=c5def5
[localization]: http://labl.es/svg?text=localization&bgcolor=c5def5
[performance]: http://labl.es/svg?text=performance&bgcolor=c5def5
[preset]: http://labl.es/svg?text=preset&bgcolor=c5def5
[renderer]: http://labl.es/svg?text=renderer&bgcolor=c5def5
[validation]: http://labl.es/svg?text=validation&bgcolor=c5def5
[core_link]: https://github.com/openstreetmap/iD/issues?q=is%3Aopen+is%3Aissue+label%3Acore
[localization_link]: https://github.com/openstreetmap/iD/issues?q=is%3Aopen+is%3Aissue+label%3Alocalization
[performance_link]: https://github.com/openstreetmap/iD/issues?q=is%3Aopen+is%3Aissue+label%3Aperformance
[preset_link]: https://github.com/openstreetmap/iD/issues?q=is%3Aopen+is%3Aissue+label%3Apreset
[renderer_link]: https://github.com/openstreetmap/iD/issues?q=is%3Aopen+is%3Aissue+label%3Arenderer
[validation_link]: https://github.com/openstreetmap/iD/issues?q=is%3Aopen+is%3Aissue+label%3Avalidation
Dark Grey labels are for **waitfor items**. We won't work on these now, but we'll keep the issues
open while we wait for something to happen.
* <sub>[![waitfor][waitfor]][waitfor_link]
[![waitfor-consensus][waitfor-consensus]][waitfor-consensus_link]
[![waitfor-icon][waitfor-icon]][waitfor-icon_link]
[![waitfor-info][waitfor-info]][waitfor-info_link]
[![waitfor-upstream][waitfor-upstream]][waitfor-upstream_link]</sub>
[waitfor]: http://labl.es/svg?text=waitfor&bgcolor=444
[waitfor-consensus]: http://labl.es/svg?text=waitfor-consensus&bgcolor=444
[waitfor-icon]: http://labl.es/svg?text=waitfor-icon&bgcolor=444
[waitfor-info]: http://labl.es/svg?text=waitfor-info&bgcolor=444
[waitfor-upstream]: http://labl.es/svg?text=waitfor-upstream&bgcolor=444
[waitfor_link]: https://github.com/openstreetmap/iD/issues?q=is%3Aopen+is%3Aissue+label%3Awaitfor
[waitfor-consensus_link]: https://github.com/openstreetmap/iD/issues?q=is%3Aopen+is%3Aissue+label%3Awaitfor-consensus
[waitfor-icon_link]: https://github.com/openstreetmap/iD/issues?q=is%3Aopen+is%3Aissue+label%3Awaitfor-icon
[waitfor-info_link]: https://github.com/openstreetmap/iD/issues?q=is%3Aopen+is%3Aissue+label%3Awaitfor-info
[waitfor-upstream_link]: https://github.com/openstreetmap/iD/issues?q=is%3Aopen+is%3Aissue+label%3Awaitfor-upstream
Light Grey labels are for **wontfix items**. We've decided these doesn't belong in
iD at this time. Don't feel bad, sometimes we change our minds later and revisit them!
(ISATIDL = "I saw a thing I don't like", a common OpenStreetMap complaint)
* <sub>[![wontfix][wontfix]][wontfix_link]
[![wontfix-confusing][wontfix-confusing]][wontfix-confusing_link]
[![wontfix-ISATIDL][wontfix-ISATIDL]][wontfix-ISATIDL_link]
[![wontfix-low-impact][wontfix-low-impact]][wontfix-low-impact_link]</sub>
[wontfix]: http://labl.es/svg?text=wontfix&bgcolor=eee
[wontfix-confusing]: http://labl.es/svg?text=wontfix-confusing&bgcolor=eee
[wontfix-ISATIDL]: http://labl.es/svg?text=wontfix-ISATIDL&bgcolor=eee
[wontfix-low-impact]: http://labl.es/svg?text=wontfix-low-impact&bgcolor=eee
[wontfix_link]: https://github.com/openstreetmap/iD/issues?q=is%3Aclosed+is%3Aissue+label%3Awontfix
[wontfix-confusing_link]: https://github.com/openstreetmap/iD/issues?q=is%3Aclosed+is%3Aissue+label%3Awontfix-confusing
[wontfix-ISATIDL_link]: https://github.com/openstreetmap/iD/issues?q=is%3Aclosed+is%3Aissue+label%3Awontfix-ISATIDL
[wontfix-low-impact_link]: https://github.com/openstreetmap/iD/issues?q=is%3Aclosed+is%3Aissue+label%3Awontfix-low-impact
Special:
* <sub>[![bluesky][bluesky]][bluesky_link]</sub> -
Bluesky issues are extra challenging. They might require weeks of development or not even be possible.
* <sub>[![wip][wip]][wip_link]</sub> -
Work in Progress. Don't start work on these, somebody else already did!
[bluesky]: http://labl.es/svg?text=bluesky&bgcolor=1d76db
[wip]: http://labl.es/svg?text=wip&bgcolor=fbca04
[bluesky_link]: https://github.com/openstreetmap/iD/issues?q=is%3Aopen+is%3Aissue+label%3Abluesky
[wip_link]: https://github.com/openstreetmap/iD/issues?q=is%3Aopen+is%3Aissue+label%3Awip
## Verifying Bug Fixes
To verify a bug fix (or test a new feature), use the [master deployment](http://www.openstreetmap.us/iD/master/)
(http://www.openstreetmap.us/iD/master/), which is updated every 10 minutes with the latest code.
To verify a bug fix (or test a new feature), use the [develop deployment](http://preview.ideditor.com/master/)
(http://preview.ideditor.com/master/), which is updated every 10 minutes with the
latest code and translation strings.
The deployments on openstreetmap.org and http://www.openstreetmap.us/iD/release/ are updated only
The deployments on openstreetmap.org and http://preview.ideditor.com/release/ are updated only
with stable releases. Issues that are marked fixed in the tracker may still be present.
## Translating
Translations are managed using the
[Transifex](https://www.transifex.com/ideditor/id-editor/) platform. After
[Transifex](https://www.transifex.com/projects/p/id-editor/) platform. After
signing up, you can go to [iD's project
page](https://www.transifex.com/ideditor/id-editor/), select a language and
click *Translate now* to start translating. Translations are divided into two
sections, *core*, which contains text for the main interface of iD, and
*presets*, which has the text for labeling feature presets.
page](https://www.transifex.com/projects/p/id-editor/), select a language and
click **Translate** to start translating. Translations are divided into
separate resources:
* *core* - contains text for the main interface of iD
* *presets* - contains the text for labeling feature presets
* *imagery* - contains text for imagery names and descriptions
The words in brackets, for example `{name}`, should not be translated into a
new language: it's replaced with a place name when iD presents the text. So a
@@ -64,8 +216,11 @@ preset fields, and lists of search terms. You do _not_ need to translate the
search terms literally -- use a set of synonyms and related terms appropriate
to the target language, separated by commas.
[iD translation project on
Transifex](https://www.transifex.com/ideditor/id-editor/)
You can check your translations in the [master deployment](http://preview.ideditor.com/master/)
(http://preview.ideditor.com/master/), which is updated every 10 minutes with the
latest code and translation strings.
[iD translation project on Transifex](https://www.transifex.com/projects/p/id-editor/)
To get notifications when translation source files change, click **Watch
project** button near the bottom of the project page. You can edit your
@@ -73,7 +228,7 @@ project** button near the bottom of the project page. You can edit your
getting too many notifications.
Translations are licensed under
[ISC](https://raw.github.com/openstreetmap/iD/master/LICENSE), the same license
[ISC](https://raw.github.com/openstreetmap/iD/develop/LICENSE.md), the same license
as iD.
**Why are there so many duplicate "Type" translations?** There are multiple
@@ -90,7 +245,15 @@ These are separate translations for uniformity reasons and because some language
may translate "type" differently in "type of aeroway" and "type of amenity", for
example.
## Adding New Strings for Translation
**Why can't I find the Osmose QA layer translations?** The Osmose QA strings are
pulled in from the external Osmose API. You can contribute to the
[Osmose Transifex project](https://www.transifex.com/projects/p/osmose/)
and the results will be seen in iD once deployed.
Note that if you want to add/update English translations in Osmose then you will
need to head on over to the [Osmose backend source code](https://github.com/osm-fr/osmose-backend).
## Adding New Strings for Translation or Updating Existing Strings
iD translates strings with a `t` function - `t('foo.bar')` translate the key
`foo.bar` into the current language. If you introduce new translatable strings
@@ -99,23 +262,31 @@ to iD, only display them in the interface through the `t()` function.
Then, add the new string to `data/core.yaml`. The translation system, Transifex,
will automatically detect the change.
Use `make` to build the translations with the local changes.
`make translate` can be used to pull the latest translations from Transifex.
If you are updating an existing string, update it in `data/core/yaml` and run
`npm run build` to generate the `en.json` file automatically, then commit both
modified files.
Use `npm run build` to build the translations with the local changes.
`npm run translations` can be used to pull the latest translations from Transifex.
## Contributing Documentation
Documentation is maintained as a series of [Markdown](http://daringfireball.net/projects/markdown/)
documents in [core.yaml](/data/core.yaml). The documentation
is in the `help` section (currently starting at line 258). The first line
is in the `help` section. The first line
of each new section of documentation should be of the form
# GPS
```markdown
# GPS
```
This will be used for navigation and as its title in iD. Documentation is
shown in alphabetical order, so most documentation is prefixed with `02-` and
so on in order to keep it in a certain order.
This will be used for navigation and as its title in iD. To add a new piece
of documentation, simply add to [/data/core.yaml](/data/core.yaml) in the
same format as the rest, include your new corresponding `docKey` in
[/modules/ui/help.js](/modules/ui/help.js) and call `npm run build`.
To add a new piece of documentation, simply add to [core.yaml](/data/core.yaml) in the same format as the rest.
## Adding or Refining Presets
@@ -123,22 +294,27 @@ Presets save time for iD users by automatically showing them the tags they are
likely to add for a given feature. They are stored in `data/presets/presets`. If
you're going to update the presets, [review the Presets README](/data/presets/README.md).
## Javascript
We use the [Airbnb style for Javascript](https://github.com/airbnb/javascript) with
only one difference:
## JavaScript
**4 space soft tabs always for Javascript, not 2.**
Legacy iD code was written with ES5 syntax, however we now support most ES6 syntax via [Rollup.js](https://rollupjs.org/guide/en) and the [Rollup Bublé plugin](https://github.com/rollup/plugins/tree/master/packages/buble). You can find details about Bublé [here](https://buble.surge.sh/guide/).
No aligned `=`, no aligned arguments, spaces are either indents or the 1
space between expressions. No hard tabs, ever.
In order to continue to support older browsers like IE11 and our PhantomJS-based test runner, we also include the [browser-polyfills](https://github.com/tiagomapmarques/browser-polyfills#what-does-it-have) package.
We mostly follow the Airbnb style guide for JavaScript:
- [Modern ES6](https://github.com/airbnb/javascript)
- [Legacy ES5](https://github.com/airbnb/javascript/tree/es5-deprecated/es5)
We ask that you follow the convention of using 4 space indent in ES5 files and 2 space indent in ES6 files. While the indenting doesn't matter to the compiler, it does make it easier for us humans to see at a glance whether a file has been "upgraded" to ES6.
Always spaces, never tabs.
JavaScript code should pass through [ESLint](http://eslint.org/) with no warnings.
Javascript code should pass through [ESLint](http://eslint.org/) with no
warnings.
## HTML
There isn't much HTML in iD, but what there is is similar to JS: 4 spaces
There isn't much HTML in iD, but what there is is similar to JavaScript: 4 spaces
always, indented by the level of the tree:
```html
@@ -147,49 +323,37 @@ always, indented by the level of the tree:
</div>
```
## CSS
Just like HTML and Javascript, 4 space soft tabs always.
Just like HTML and JavaScript, 4 space soft tabs always.
```css
.radial-menu-tooltip {
.menu-tooltip {
background: rgba(255, 255, 255, 0.8);
}
```
We write vanilla CSS with no preprocessing step. Since iD targets modern browsers,
feel free to use newer features wisely.
(Chrome, Firefox, Safari, Opera, IE11, and Edge) feel free to use newer features wisely.
## Tests
Test your code and make sure it passes.
First ensure you have a `phantomjs` binary, version 2.0 or later, available on your `$PATH`. On a Mac,
you can install this via homebrew with `brew install phantomjs`. Then:
1. Go to the directory where you have checked out `iD`
2. run `npm install`
3. run `make`
4. run `npm test` to see whether your tests pass or fail.
3. run `npm test` to see whether your tests pass or fail.
## Building / Installing
You can build a concatenated and minified version of iD with the command `make`. Node.js is
required for this.
You can rebuild iD completely with the command `npm run all`.
iD will be built to the `dist` directory. This directory is self-contained; you can copy it
into the public directory of your webserver to deploy iD.
## Live reloading
You can use [live-server](https://www.npmjs.com/package/live-server) *(npm module)* to
reload the browser automatically whenever there is a change in code.
1. run `npm install -g live-server`
2. run `live-server .` or `live-server dist`
*(You will be automatically redirected to the local server page.)*
*(Note: Sometimes auto reload might not display correctly and you might need to rebuild iD by running `make`.)*
## Licensing
@@ -197,22 +361,93 @@ iD is available under the [ISC License](https://opensource.org/licenses/ISC).
Some of the libraries it uses are under different licenses. If you're contributing
to iD, you're contributing ISC Licensed code.
## Submitting Changes
Let's say that you've thought of a great improvement to iD - a change that
turns everything red (please do not do this, we like colors other than red).
We like when people get involved! iD is a busy project, and it helps the
maintainers if you first open an issue to ask whether an idea makes sense,
instead of surprising us with a pull request.
In your local copy, make a branch for this change:
In your local copy, make a branch for this change using a descriptive branch name:
git checkout -b make-red
git checkout -b fix-the-thing
Make your changes to source files. By source files we mean the files in `js/`.
the `iD.js` and `iD.min.js` files in this project are autogenerated - don't edit
them.
Make your changes to source files under `modules/`.
The `iD.js` and `iD.min.js` files in this project are autogenerated - don't edit them.
So let's say you've changed `js/ui/confirm.js`.
1. Run `eslint js/id` to make sure your code is clean
2. Run tests with `npm test`
1. Try your change locally. Run `npm start` and visit `localhost:8080` in a browser.
2. Run lint and tests with `npm test`
3. Commit your changes with an informative commit message
4. [Submit a pull request](https://help.github.com/articles/using-pull-requests) to the `openstreetmap/iD` project.
## Using GitHub and git
If you are new to GitHub or git you can read the [GitHub Guides](https://guides.github.com)
"Understanding the GitHub Flow", "Git Handbook" and "Forking Projects" could be especially interesting to you.
### Step by Step
Additionally here is a step-by-step workflow example for beginners:
1. [Login](https://github.com/login) to your GitHub account or [create](https://services.github.com/on-demand/intro-to-github/create-github-account) a GitHub account, if you do not already have one.
2. Go to the [iD main repository](https://github.com/openstreetmap/iD) and fork iD into your GitHub account (Fork is top right).
3. Set up [Git](https://help.github.com/articles/set-up-git/) and prepare for Authenticating with GitHub from Git.
4. Clone or download your local copy of iD from your GitHub account using https `git clone https://github.com/<yourgithubaccount>/iD.git` or using ssh `git clone git@github.com:{{yourgithubaccount}}/iD.git`. In your local copy you'll have a "remote" called origin.
5. Switch to the iD directory, create a working branch (choose a descriptive name) and switch to it : `cd iD ; git checkout -b <working-branch-name>`. Never do anything in develop branch.
6. Edit file(s) and try your change locally (See above).
7. Add Files and commit them `git add <files> ; git commit -m "Description of what you did"` .. repeat as needed ..
8. Push Changes to your GitHub account `git push origin <working-branch-name>`. The next push also works without the branch name: `git push origin`.
9. Go to GitHub for your fork of iD at https://github.com/{{yourgithubaccount}}/iD. GitHub will already know about your recently pushed branch, and ask if you want to create a Pull Request for it.
10. Your Pull Request will be seen by the maintainers of iD. They can merge it or ask for changes. You can update your Pull Request with Steps 7 and 8, Step 9 is required only once per Pull Request.
### Clean Up
After your Pull Request gets merged into the main repository
you can clean up by deleting the branch from your GitHub-iD-Clone and your local directory
`git push --delete origin <working-branch-name> ; git branch -d <working-branch-name>`
### Restart with another PR after some while
If you did not use your copy of iD for some while, other Pull Request gets merged and you don't have the latest version of iD. You can replace your develop with whatever is in our develop. If you have not done so yet: Add the main repo as an "upstream" remote:
`git remote add upstream git@github.com:openstreetmap/iD.git`
Then change to the develop branch and get everything from upstream (the main repository)
`git checkout develop ; git fetch --all && git reset --hard upstream/develop`
## Submitting directly in the Browser
If you want to submit Documentation, Spelling improvements, etc. which do not need testing,
you can do this with your browser in GitHub. Please don't use this to change Code and create untested Pull Requests.
You also need a GitHub account and may find this [Article about Editing](https://help.github.com/articles/editing-files-in-another-user-s-repository/) and this [Article about Pull Requests](https://help.github.com/articles/about-pull-requests/) useful.
### Step by Step with Browser
Additionally here is a step-by-step workflow example for beginners:
1. [Login](https://github.com/login) to your GitHub account or [create](https://services.github.com/on-demand/intro-to-github/create-github-account) a GitHub account, if you do not already have one.
2. Go to the [iD main repository](https://github.com/openstreetmap/iD) and fork iD into your GitHub account (Fork is top right).
3. Create a New Branch by clicking on "Branch: develop" and entering the name of a new branch (choose a descriptive name).
4. Navigate to the file you want to edit and click on "Edit this file" and apply your changes to the file. Alternatively, you could also "Create a new file".
5. When finished editing the file enter a commit text (the description is optional) and commit directly to the newly created branch. You may repeat 4 and 5 until all required changes are committed.
6. Navigate back to your "id" project - https://github.com/{{yourgithubaccount}}/iD
7. Follow this [Article about Pull Requests](https://help.github.com/articles/about-pull-requests/) to create a new pull request for your change
+23 -5
View File
@@ -2,20 +2,36 @@
Two syllables: "eye dee".
## How can I help translate iD into another language or fix a mistranslation?
Please see [CONTRIBUTING.md](https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating)
Please see [CONTRIBUTING.md](https://github.com/openstreetmap/iD/blob/develop/CONTRIBUTING.md#translating)
## How can I report an issue with background imagery?
To report an issue with missing or cloudy imagery:
* _For Mapbox Satellite layer:_ Use [this imagery request tool](https://www.mapbox.com/labs/request) to zoom to the location with the issue and draw a box around it.
* _For Bing Satellite layer:_ Open the location in [Bing Maps](https://www.bing.com/maps) and click the "Report a problem" link on the sidebar.
* _For Mapbox Satellite layer:_ Zoom into the location in [this imagery feedback tool](https://apps.mapbox.com/feedback/satellite/) and describe the problem.
* _For Bing Satellite layer:_ Open the location in [Bing Maps](https://www.bing.com/maps), click the "Feedback" button and choose "Report a map problem" option.
* _For Esri World Imagery:_ You can open a new issue using the [Imagery Map Feedback tool](https://www.arcgis.com/home/item.html?id=ebdfa4146680410bb952c7d532ea5407).
iD's list of available background imagery sources come from the [editor-layer-index](https://github.com/osmlab/editor-layer-index)
project. If you know of a more recent imagery source that is licensed for this use,
please open a request there with the link and license details.
## I'm having trouble seeing some of the colors. Is there a way to customize or change them?
Because iD uses CSS and SVG for all its rendering, users can override the colors
with the [Stylish extension](https://en.wikipedia.org/wiki/Stylish) on Firefox or Chrome.
Stylish also allows users to share custom styles with others.
You can find detailed instructions on how to install Stylish
[here on learnosm.org](http://learnosm.org/en/hot-tips/enhance/).
See also: https://github.com/openstreetmap/iD/issues/3095#issuecomment-224988925
## Why not use canvas rather than SVG?
Using canvas rather than SVG would require implementing a scenegraph, hit-testing,
@@ -31,6 +47,7 @@ In other words, the decision to use SVG rather than canvas was a classic perform
vs. implementation cost tradeoff with strong arguments for trading off performance to
reduce implementation costs.
## Can I use iD offline?
iD does not currently have an offline mode.
@@ -42,10 +59,11 @@ main things iD uses the network for:
* Downloading tiles -- ditto
* Uploading changes
We've though a little about [caching tiles](https://github.com/openstreetmap/iD/issues/127)
We've thought a little about [caching tiles](https://github.com/openstreetmap/iD/issues/127)
and downloaded data, but haven't actively worked on it, nor on the data download/upload
question.
## Can I use iD with my own OSM server?
Yes, you can. You will need to [install](https://github.com/openstreetmap/openstreetmap-website/blob/master/INSTALL.md)
@@ -53,7 +71,7 @@ and [configure](https://github.com/openstreetmap/openstreetmap-website/blob/mast
an instance of the Rails Port, the server that runs the OpenStreetMap website and API.
Once you have the Rails Port running, you may edit as normal using the version of iD that
is bundled with it. Your changes will be saved to your own database. To use a standalone iD with your own api, you may edit the [connection.js](https://github.com/openstreetmap/iD/blob/master/js/id/core/connection.js) file.
is bundled with it. Your changes will be saved to your own database. To use a standalone iD with your own api, you may edit the [osm.js](https://github.com/openstreetmap/iD/blob/develop/modules/services/osm.js) file.
Depending on your requirements, you may also want to set up [cgimap](https://github.com/openstreetmap/cgimap)
and/or a tile rendering stack, but neither of these are required for editing with iD.
+3 -1
View File
@@ -1,4 +1,6 @@
Copyright (c) 2015, iD Contributors
## ISC License
Copyright (c) 2017, iD Contributors
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
-320
View File
@@ -1,320 +0,0 @@
# See the README for installation instructions.
all: \
$(BUILDJS_TARGETS) \
dist/iD.css \
dist/iD.js \
dist/iD.min.js \
dist/img/iD-sprite.svg \
dist/img/maki-sprite.svg
MAKI_SOURCES = node_modules/maki/src/*.svg
$(MAKI_SOURCES): node_modules/.install
dist/img/maki-sprite.svg: $(MAKI_SOURCES) Makefile
node_modules/.bin/svg-sprite --symbol --symbol-dest . --symbol-sprite $@ $(MAKI_SOURCES)
data/feature-icons.json: $(MAKI_SOURCES)
cp -f node_modules/maki/www/maki-sprite.json $@
dist/img/iD-sprite.svg: svg/iD-sprite.src.svg svg/iD-sprite.json
node svg/spriteify.js --svg svg/iD-sprite.src.svg --json svg/iD-sprite.json > $@
BUILDJS_TARGETS = \
data/presets/categories.json \
data/presets/fields.json \
data/presets/presets.json \
data/presets.yaml \
data/taginfo.json \
data/data.js \
dist/locales/en.js \
dist/presets.js \
dist/imagery.js
BUILDJS_SOURCES = \
$(filter-out $(BUILDJS_TARGETS), $(shell find data -type f -name '*.json')) \
data/feature-icons.json \
data/core.yaml
$(BUILDJS_TARGETS): $(BUILDJS_SOURCES) build.js
node build.js
dist/iD.js: \
js/lib/bootstrap-tooltip.js \
js/lib/d3.v3.js \
js/lib/d3.combobox.js \
js/lib/d3.geo.tile.js \
js/lib/d3.jsonp.js \
js/lib/d3.keybinding.js \
js/lib/d3.one.js \
js/lib/d3.dimensions.js \
js/lib/d3.trigger.js \
js/lib/d3.curtain.js \
js/lib/d3.value.js \
js/lib/diff3.js \
js/lib/jxon.js \
js/lib/lodash.js \
js/lib/osmauth.js \
js/lib/rbush.js \
js/lib/sexagesimal.js \
js/lib/togeojson.js \
js/lib/marked.js \
js/id/start.js \
js/id/id.js \
js/id/services.js \
js/id/services/mapillary.js \
js/id/services/nominatim.js \
js/id/services/taginfo.js \
js/id/services/wikipedia.js \
js/id/util.js \
js/id/util/session_mutex.js \
js/id/util/suggest_names.js \
js/id/geo.js \
js/id/geo/extent.js \
js/id/geo/intersection.js \
js/id/geo/multipolygon.js \
js/id/geo/raw_mercator.js \
js/id/actions.js \
js/id/actions/add_entity.js \
js/id/actions/add_member.js \
js/id/actions/add_midpoint.js \
js/id/actions/add_vertex.js \
js/id/actions/change_member.js \
js/id/actions/change_preset.js \
js/id/actions/change_tags.js \
js/id/actions/circularize.js \
js/id/actions/connect.js \
js/id/actions/copy_entities.js \
js/id/actions/delete_member.js \
js/id/actions/delete_multiple.js \
js/id/actions/delete_node.js \
js/id/actions/delete_relation.js \
js/id/actions/delete_way.js \
js/id/actions/deprecate_tags.js \
js/id/actions/discard_tags.js \
js/id/actions/disconnect.js \
js/id/actions/join.js \
js/id/actions/merge.js \
js/id/actions/merge_polygon.js \
js/id/actions/merge_remote_changes.js \
js/id/actions/move.js \
js/id/actions/move_node.js \
js/id/actions/noop.js \
js/id/actions/orthogonalize.js \
js/id/actions/restrict_turn.js \
js/id/actions/reverse.js \
js/id/actions/revert.js \
js/id/actions/rotate_way.js \
js/id/actions/split.js \
js/id/actions/straighten.js \
js/id/actions/unrestrict_turn.js \
js/id/behavior.js \
js/id/behavior/add_way.js \
js/id/behavior/breathe.js \
js/id/behavior/copy.js \
js/id/behavior/drag.js \
js/id/behavior/draw.js \
js/id/behavior/draw_way.js \
js/id/behavior/edit.js \
js/id/behavior/hash.js \
js/id/behavior/hover.js \
js/id/behavior/lasso.js \
js/id/behavior/paste.js \
js/id/behavior/select.js \
js/id/behavior/tail.js \
js/id/modes.js \
js/id/modes/add_area.js \
js/id/modes/add_line.js \
js/id/modes/add_point.js \
js/id/modes/browse.js \
js/id/modes/drag_node.js \
js/id/modes/draw_area.js \
js/id/modes/draw_line.js \
js/id/modes/move.js \
js/id/modes/rotate_way.js \
js/id/modes/save.js \
js/id/modes/select.js \
js/id/operations.js \
js/id/operations/circularize.js \
js/id/operations/continue.js \
js/id/operations/delete.js \
js/id/operations/disconnect.js \
js/id/operations/merge.js \
js/id/operations/move.js \
js/id/operations/orthogonalize.js \
js/id/operations/reverse.js \
js/id/operations/rotate.js \
js/id/operations/split.js \
js/id/operations/straighten.js \
js/id/core/connection.js \
js/id/core/difference.js \
js/id/core/entity.js \
js/id/core/graph.js \
js/id/core/history.js \
js/id/core/node.js \
js/id/core/relation.js \
js/id/core/tags.js \
js/id/core/tree.js \
js/id/core/way.js \
js/id/renderer/background.js \
js/id/renderer/background_source.js \
js/id/renderer/features.js \
js/id/renderer/map.js \
js/id/renderer/tile_layer.js \
js/id/svg.js \
js/id/svg/areas.js \
js/id/svg/defs.js \
js/id/svg/gpx.js \
js/id/svg/icon.js \
js/id/svg/labels.js \
js/id/svg/layers.js \
js/id/svg/lines.js \
js/id/svg/mapillary_images.js \
js/id/svg/mapillary_signs.js \
js/id/svg/midpoints.js \
js/id/svg/osm.js \
js/id/svg/points.js \
js/id/svg/tag_classes.js \
js/id/svg/turns.js \
js/id/svg/vertices.js \
js/id/ui.js \
js/id/ui/account.js \
js/id/ui/attribution.js \
js/id/ui/background.js \
js/id/ui/cmd.js \
js/id/ui/commit.js \
js/id/ui/confirm.js \
js/id/ui/conflicts.js \
js/id/ui/contributors.js \
js/id/ui/disclosure.js \
js/id/ui/entity_editor.js \
js/id/ui/feature_info.js \
js/id/ui/feature_list.js \
js/id/ui/flash.js \
js/id/ui/full_screen.js \
js/id/ui/geolocate.js \
js/id/ui/help.js \
js/id/ui/info.js \
js/id/ui/inspector.js \
js/id/ui/intro.js \
js/id/ui/lasso.js \
js/id/ui/loading.js \
js/id/ui/map_data.js \
js/id/ui/map_in_map.js \
js/id/ui/modal.js \
js/id/ui/modes.js \
js/id/ui/notice.js \
js/id/ui/preset_icon.js \
js/id/ui/preset.js \
js/id/ui/preset_list.js \
js/id/ui/radial_menu.js \
js/id/ui/raw_member_editor.js \
js/id/ui/raw_membership_editor.js \
js/id/ui/raw_tag_editor.js \
js/id/ui/restore.js \
js/id/ui/save.js \
js/id/ui/scale.js \
js/id/ui/selection_list.js \
js/id/ui/sidebar.js \
js/id/ui/source_switch.js \
js/id/ui/spinner.js \
js/id/ui/splash.js \
js/id/ui/status.js \
js/id/ui/success.js \
js/id/ui/tag_reference.js \
js/id/ui/toggle.js \
js/id/ui/undo_redo.js \
js/id/ui/view_on_osm.js \
js/id/ui/zoom.js \
js/id/ui/preset/access.js \
js/id/ui/preset/address.js \
js/id/ui/preset/check.js \
js/id/ui/preset/combo.js \
js/id/ui/preset/cycleway.js \
js/id/ui/preset/input.js \
js/id/ui/preset/localized.js \
js/id/ui/preset/maxspeed.js \
js/id/ui/preset/radio.js \
js/id/ui/preset/restrictions.js \
js/id/ui/preset/textarea.js \
js/id/ui/preset/wikipedia.js \
js/id/ui/intro/area.js \
js/id/ui/intro/line.js \
js/id/ui/intro/navigation.js \
js/id/ui/intro/point.js \
js/id/ui/intro/start_editing.js \
js/id/presets.js \
js/id/presets/category.js \
js/id/presets/collection.js \
js/id/presets/field.js \
js/id/presets/preset.js \
js/id/validations.js \
js/id/validations/deprecated_tag.js \
js/id/validations/many_deletions.js \
js/id/validations/missing_tag.js \
js/id/validations/tag_suggests_area.js \
js/id/end.js \
js/lib/locale.js \
data/introGraph.js
.INTERMEDIATE dist/iD.js: data/data.js
dist/iD.js: node_modules/.install Makefile
@rm -f $@
cat $(filter %.js,$^) > $@
dist/iD.min.js: dist/iD.js Makefile
@rm -f $@
node_modules/.bin/uglifyjs $< -c -m -o $@
dist/iD.css: css/*.css
cat css/reset.css css/map.css css/app.css > $@
node_modules/.install: package.json
npm install
touch node_modules/.install
clean:
rm -f $(BUILDJS_TARGETS) data/feature-icons.json dist/iD*.js dist/iD.css dist/img/*.svg
translations:
node data/update_locales
imagery:
npm install editor-layer-index@git://github.com/osmlab/editor-layer-index.git#gh-pages
node data/update_imagery
suggestions:
npm install name-suggestion-index@git://github.com/osmlab/name-suggestion-index.git
cp node_modules/name-suggestion-index/name-suggestions.json data/name-suggestions.json
wikipedias:
npm install wmf-sitematrix@git://github.com/osmlab/wmf-sitematrix.git
cp node_modules/wmf-sitematrix/wikipedia.min.json data/wikipedia.json
D3_FILES = \
node_modules/d3/src/start.js \
node_modules/d3/src/arrays/index.js \
node_modules/d3/src/behavior/behavior.js \
node_modules/d3/src/behavior/zoom.js \
node_modules/d3/src/core/index.js \
node_modules/d3/src/event/index.js \
node_modules/d3/src/geo/length.js \
node_modules/d3/src/geo/mercator.js \
node_modules/d3/src/geo/path.js \
node_modules/d3/src/geo/stream.js \
node_modules/d3/src/geom/polygon.js \
node_modules/d3/src/geom/hull.js \
node_modules/d3/src/selection/index.js \
node_modules/d3/src/transition/index.js \
node_modules/d3/src/xhr/index.js \
node_modules/d3/src/end.js
js/lib/d3.v3.js: $(D3_FILES)
node_modules/.bin/smash $(D3_FILES) > $@
@echo 'd3 rebuilt. Please reapply 7e2485d, 4da529f, and 223974d'
js/lib/lodash.js: Makefile
node_modules/.bin/lodash --development --output $@ include="any,assign,bind,chunk,clone,compact,contains,debounce,difference,each,every,extend,filter,find,first,forEach,forOwn,groupBy,indexOf,intersection,isEmpty,isEqual,isFunction,keys,last,map,omit,pairs,pluck,reject,some,throttle,union,uniq,unique,values,without,flatten,value,chain,cloneDeep,merge,pick,reduce" exports="global,node"
-322
View File
@@ -1,322 +0,0 @@
## Browser Features caniuse
* [CORS](http://caniuse.com/#feat=cors)
* [SVG](http://caniuse.com/#feat=svg)
* [CSS 3D Transforms](http://caniuse.com/#feat=transforms3d): No IE9, No Opera
* [localStorage](http://caniuse.com/#feat=namevalue-storage)
* [hashchange event](http://caniuse.com/#feat=hashchange)
## Interactions
Way drawing strategy:
* START: Click to start way
* END: Click on own node
* END: Click on self-segment
* END: Escape key
* [Adding a new road in MapZen](http://www.youtube.com/watch?v=tdpDm6MiUEM)
* [Editing turn restrictions](http://www.youtube.com/watch?v=DyHorSJFbyg)
### Continuing Ways
Continuing ways is a tricky problem: for instance, fixing unclosed areas by
completing the loop.
**Potlatch** does this by clicking on the way (since it does
not show handles by default), showing handles, and if you click on the start
or end, it immediately starts drawing. If you escape out of that draw, you can
then edit the node itself.
**JOSM**, since it has an `add` mode, just selects the node if you click a start
or end. You need to be in draw mode, and then clicking on a start/end node
extends the way.
_However_ JOSM also does a little trick where if you have a node selected and
then enter draw mode, it'll start either a new way or a continuation of the way,
depending on whether it's the start or the end.
Also what happens if you click on a point that happens to be the start or end
of more than one way?
## Relations and Turn Restrictions
http://wiki.openstreetmap.org/wiki/Relation:restriction
## Pathological conditions
* Ways with one node
* Relations which contain themselves (circular references)
* Nodes with no tags and no way attached
* Ways which contain only nodes that are subsets of the nodes of other ways
* Paths with intersecting boundaries (invalid geometries)
* Nodes with tags that repeat what the way says
## Code Layout
This follows a similar layout to d3: each module of d3 has a file with its exact
name, like
```javascript
// format.js
iD.format = {};
```
And the parts of that module are in separate files that implement `iD.format.XML`
and so on.
## The Graph
The data model of OSM is something like
root -> relations (-> relations) -> ways -> nodes
\ \> nodes
\- ways -> nodes
\- nodes
In English:
* Relations have (ways, nodes, relations)
* Ways have (nodes)
* Nodes have ()
iD implements a [persistent data structure](http://en.wikipedia.org/wiki/Persistent_data_structure)
over the OSM data model. Instead of updating the graph in place when edits are made and storing enough
information about the change so that it can be undone in place, changes produce a new version of the
graph data structure, and the previous version is left untouced. "Undo" is accomplished simply by
reverting to the previous version.
The persistent data structure approach also takes advantage of the fact that the typical change modifies
only a small portion of the graph. The unchanged majority of the graph is shared between revisions,
keeping memory use to a minimum. For example, the `iD.actions.RemoveWayNode` action removes a single
node from a way. It produces new versions of three objects:
* The Array of nodes in the way.
* The way itself. The new version references the new Array of nodes.
* The Graph. The new version references the new way.
The previous versions of these three objects are retained. Since the previous version of the Graph
continues to reference the previous version of the way and its nodes, the action can be undone by
restoring this version. Meanwhile, both versions of the Graph share references to all the other
objects. Since these objects are never themselves mutated, this is safe.
In concrete terms, this approach dictates the following rule: all methods that produce a change in
the state of the data model objects (Entity, Graph) or their constituent parts (e.g. nodes Array,
tags Object) must return a new instance of the appropriate type, leaving the current instance
unchanged.
## UI
Rendering and UI code generally follows a [convention for reusable elements established by d3](http://bost.ocks.org/mike/chart/).
Constructor functions typically return a function decorated with additional properties. The function
can be called with `this` set to a d3 selection in order to set up the HTML structure. This is usually
done via [selection.call](https://github.com/mbostock/d3/wiki/Selections#wiki-call).
Accessors are implemented as a unified getter/setter function. When called with no arguments,
it acts as a getter; when called with an argument it acts as a setter and returns self, for
chaining. Accessors are preferable to constructor arguments; constructors typically take zero
arguments.
## Performance
See blog post: http://mapbox.com/osmdev/2012/11/20/getting-serious-about-svg/
Main performance concerns of iD:
### Panning & zooming performance of the map
SVG redraws are costly, especially when they require all features to
be reprojected.
Approaches:
* Using CSS transforms for intermediate map states, and then redrawing when
map movement stops
* "In-between" projecting features to make reprojection cheaper
### Memory overhead of objects
Many things will be stored by iD. With the graph structure in place, we'll
be storing much more.
We also need to worry about **memory leaks**, which have been a big problem
in Potlatch 2. Storing OSM data and versions leads to a lot of object-referencing
in Javascript.
## Connection, Graph, Map
The Map is a display and manipulation element. It should have minimal particulars
of how exactly to store or retrieve data. It gets data from Connection and
asks for it from Graph.
Graph stores all of the objects and all of the versions of those objects.
Connection requests objects over HTTP, parses them, and provides them to Graph.
## loaded
The `.loaded` member of nodes and ways is because of [relations](http://wiki.openstreetmap.org/wiki/Relation),
which refer to elements, so we want to have real references of those
elements, but we don't have the data yet. Thus when the Connection
encounters a new object but has a non-loaded representation of it,
the non-loaded version is replaced.
## Prior Art
Editors:
* [Potlatch 2](http://wiki.openstreetmap.org/wiki/Potlatch_2)
* [JOSM](http://josm.openstreetmap.de/)
* [Nokia Here Maps](http://here.net/mapcreator/6.806948216077587,-58.14884979189826,20,0,0?scope=)
* [Waze](http://www.waze.com/)
* [Google Map Maker](http://www.google.com/mapmaker)
JOSM and Potlatch 2 appear to implement versioning in the same way, but having
an undo stack:
```java
// src/org/openstreetmap/josm/actions/MoveNodeAction.java
Main.main.undoRedo.add(new MoveCommand(n, coordinates));
// src/org/openstreetmap/josm/command/MoveCommand.java
/**
* List of all old states of the objects.
*/
private List<OldState> oldState = new LinkedList<OldState>();
@Override public boolean executeCommand() {
// ...
}
@Override public void undoCommand() {
// ...
}
```
## Transforms Performance
There are two kinds of transforms: SVG and CSS. CSS transforms of SVG elements
are less efficient that SVG transforms of SVG elements. `translate` notation
has equivalent performance to `matrix` notation.
* [svg swarm with svg transform matrix](http://bl.ocks.org/d/4074697/)
* [svg swarm with svg transform translate](http://bl.ocks.org/d/4074808/)
* [svg swarm with css translate](http://bl.ocks.org/d/4074632/)
SVG transforms are a roughly 2x speedup relative to CSS - 16fps vs 32fps in
Google Chrome Beta.
* [svg swarm with css on html](http://bl.ocks.org/4081364)
However, using CSS transforms with HTML elements has vastly different and
better performance than using them with SVG elements. For this reason, iD
transforms a map-container element rather than a `g` element on panning
movements.
### Transforms in browsers
Matrix transforms are significantly slower than `translate` in webkit but
nearly equivalent in Firefox. Chrome is about 4x faster than Firefox with
transforms.
However, matrix transforms can also represent scale, and so they should be compared
with transform + scale. If you add an identity scale (`scale(1, 1)`), then
matrix and `translate scale` performance is similar in Chrome, though matrix
still lags significantly in Safari and Firefox.
## SVG point rounding performance
Rounding points in SVG gives a ~20% speedup.
* http://bl.ocks.org/4081369 ~18fps
* http://bl.ocks.org/4081356 ~22fps (about 20% faster)
And this is not just the effect of less `d` data:
* http://bl.ocks.org/4089090 ~18fps
## SVG Corner Cases
One-way streets need markers to indicate that they're one-way. Unfortunately
SVG [line markers](http://www.svgbasics.com/markers.html) are based strictly
off of vertices, so won't handle this case properly.
* textPath demo http://bl.ocks.org/4078870
* line markers http://bl.ocks.org/4079441
One way to resolve this is by using textPath with a glyph, like a gt sign or
triangle character if available. This has a few concerns:
* performance of textPath is known to suck in some cases. For simple cases, it is fine
* can we be absolutely sure about direction of text?
* glyphs need to be available. are webfonts svg-okay?
Or more importantly, we need to calculate the pixel length of a linestring,
calculate the width of a glyph, and do the necessary math so that it fills enough
of the line without overflowing.
See the [textPath element](http://www.w3.org/TR/SVG/text.html#TextPathElement) and its quirks.
See:
* [getComputedTextLength](http://www.w3.org/TR/SVG/text.html#__svg__SVGTextContentElement__getComputedTextLength)
* [getTotalLength](http://www.w3.org/TR/SVG/paths.html#__svg__SVGPathElement__getTotalLength)
## Authenticating
The [OAuth](http://oauth.net/) endpoint of OpenStreetMap does support
[CORS](http://en.wikipedia.org/wiki/Cross-origin_resource_sharing),
which is great and allows iD to do browser-side authentication. This requires some hacks,
mainly that a cookie is used to persist the token_secret between pageloads.
## Making Edits
PUT /api/0.6/changeset/create
POST /api/0.6/changeset/135324/upload
PUT /api/0.6/changeset/135324/close
## Browser problems that affect iD
See also: [Kothic browser bugs](https://github.com/kothic/kothic-js/wiki/Browser-bugs).
**one-way streets** use glyphs and textPaths. letter-spacing is not supported
in Firefox but is in webkit so we need to use spaces.
And trailing spaces are not included in getComputedTextLength:
* https://bugzilla.mozilla.org/show_bug.cgi?id=346694
webkit doesn't let querySelectorAll select camelcase elements:
* https://bugs.webkit.org/show_bug.cgi?id=46800
* https://bugs.webkit.org/show_bug.cgi?id=83438
* https://github.com/mbostock/d3/issues/925
Firefox does not fire a `blur` event when an element is removed from the DOM,
unlike WebKit browsers.
Firefox does not support [the focusout event](https://bugzilla.mozilla.org/show_bug.cgi?id=687787).
Opera does not support `pointer-events` on HTML elements, only SVG elements.
IE10 does not support `navigator.language`, only `navigator.userLanguage`
## Transients
The graph supports `transient`, which is storage for non-versioned mutable
properties _about_ entities that are stored outside of entities. For instance,
`extent` is about an entity, but can be invalidated and stored without getting
a new graph.
## Data sources
*deprecated.json*
from http://wiki.openstreetmap.org/wiki/Deprecated_features
TODO: deal with deprecated 'class' tag
does not deal with landuse=wood because of indecision
we will not care about http://taginfo.openstreetmap.org/tags/bicycle_parking=sheffield
*discarded.json*
entirely discarded tags
https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/XMLConnection.as#L24
+41
View File
@@ -0,0 +1,41 @@
## iD Editor Privacy Policy
iD Editor is an open source OpenStreetMap editor. You are not required to use iD in order to use or edit OpenStreetMap, and the OpenStreetMap Foundation does not operate iD. You can learn more about OpenStreetMap and the OpenStreetMap Foundation at [https://www.openstreetmap.org/about](https://www.openstreetmap.org/about) and [https://wiki.osmfoundation.org/wiki/Main_Page](https://wiki.osmfoundation.org/wiki/Main_Page). You can learn more about the iD Editor project and its maintainers at [https://github.com/openstreetmap/iD](https://github.com/openstreetmap/iD).
### Source code and website ([http://ideditor.com/](http://ideditor.com/))
If you choose to interact with the project GitHub page or website hosted by GitHub, you do so in accordance with [GitHubs Privacy Policy](https://help.github.com/en/articles/github-privacy-statement). If you choose to interact with the pre-release version of iD at [http://preview.ideditor.com/release](http://preview.ideditor.com/release) or [http://preview.ideditor.com/master](http://preview.ideditor.com/master), that use is governed by [AWSs privacy policy](https://aws.amazon.com/privacy/). If you choose any other communications medium to contact the maintainers of iD, that use is governed by the policies of those respective mediums. See [https://github.com/openstreetmap/iD](https://github.com/openstreetmap/iD) for more information. iD may use any feedback you provide.
### Cookies
iD use cookies, website logs and other similar data and technologies (i) to preserve information so you will not have to re-enter or re-encounter it during your visit or on subsequent visits; (ii) to maintain sessions for authenticated users; (iii) to monitor metrics about iD use such as the number of visitors and most used features; (iv) for internal diagnostic and analytic purposes (v) to improve the editor and related features, and (vi) to provide information to you about iD, editing, or OpenStreetMap. We have a legitimate interest in improving and informing you about iD, and certain data collection is necessary in order for iD to function. You may delete cookies from your computer, and most browsers provide the option to block cookies. However, if you block cookies, portions of iD may not work as intended. For example, you must be logged into your OpenStreetMap account in order to edit OpenStreetMap.
### Logging into OpenStreetMap
In order to make edits using iD, you must be logged into your OpenStreetMap account. You may do so via the OpenStreetMap website or a number of third-party login services. That use is governed by the respective privacy policies of the login method you choose.
### Changeset information
When you use iD to edit OpenStreetMap, iD uses the OpenStreetMap API to contribute edits. For quality control purposes, along with the information typically recorded for an OpenStreetMap edit, iD automatically adds tags to each changeset submitted with iD which identifies the changeset as one made with iD and information that indicates the users level of experience with iD editor and/or its walkthrough. See [here](https://github.com/openstreetmap/iD/blob/release/modules/ui/commit.js) for details. The [OSMF privacy policy](https://wiki.osmfoundation.org/wiki/Privacy_Policy) governs the use of this data in the OpenStreetMap database.
### Editor experience tags
Details on that are [here](https://github.com/openstreetmap/iD/blob/release/modules/ui/commit.js).
### Background imagery and other third party services
If you use background or streetside imagery to aid your edits, your browser must fetch information and images from a third-party imagery host. That use is governed by the respective privacy policies of each imagery host. The [Editor Layer Index](https://github.com/osmlab/editor-layer-index) and [iD Editor GitHub code](https://github.com/openstreetmap/iD/blob/release/modules/ui/map_data.js) provides detailed information as to imagery layer available in iD. In addition, you may use third party services to assist your editing or check for errors. See [here](https://github.com/openstreetmap/iD/tree/release/modules/services) for details. If you do not wish to interact with these third parties, do not use these features.
### Name Suggestion Index
The Name Suggestion Index is a feature in iD to aid users in consistently and accurately identifying the brand names of companies on the map. The NSI optionally fetches information and brand logos hosted on third party websites, including WikiData, Wikimedia Commons, and the brands respective Facebook and Twitter accounts. That use is governed by their respective privacy policies, including [https://foundation.wikimedia.org/wiki/Privacy_policy](https://foundation.wikimedia.org/wiki/Privacy_policy); [https://twitter.com/en/privacy](https://twitter.com/en/privacy); [https://www.facebook.com/about/privacy](https://www.facebook.com/about/privacy). Specific information about the information and images fetched for each brand may be found at [https://nsi.guide/](https://nsi.guide/). If you do not wish to interact with these third parties, you can deselect this feature in the User Preferences -> Privacy section.
### Contact
If you believe that we hold information that would allow us to correct, amend, or delete inaccurate information about you or if you believe that information about you has been processed in violation of this privacy policy or applicable law, please email us at privacy@ideditor.org.
### Changelog
* _2020-Apr-07_ - Update the iD GitHub repository file links to point to the `release` branch instead of the `master` branch.
* _2019-Dec-17_ - Initial version.
+72 -21
View File
@@ -1,53 +1,104 @@
# iD - friendly JavaScript editor for [OpenStreetMap](http://www.openstreetmap.org/)
# iD - friendly JavaScript editor for [OpenStreetMap](https://www.openstreetmap.org/)
[![Build Status](https://travis-ci.org/openstreetmap/iD.svg?branch=develop)](https://travis-ci.org/openstreetmap/iD)
:warning: _We've recently changed our branch names. [`develop`](https://github.com/openstreetmap/iD/tree/develop) is now the default branch, replacing `2.x`. [`v3-prototype`](https://github.com/openstreetmap/iD/tree/v3-prototype) is now the alpha version of iD v3, replacing `master`. [`release`](https://github.com/openstreetmap/iD/tree/release) is still `release`._
[Watch the video](https://2019.stateofthemap.us/program/sat/id-v3.html) from our talk at State of the Map US 2019 to learn more about the current status of iD and our goals for v3.
[![Build Status](https://secure.travis-ci.org/openstreetmap/iD.png)](https://travis-ci.org/openstreetmap/iD)
## Basics
* iD is a JavaScript [OpenStreetMap](http://www.openstreetmap.org/) editor.
* iD is a JavaScript [OpenStreetMap](https://www.openstreetmap.org/) editor.
* It's intentionally simple. It lets you do the most basic tasks while
not breaking other people's data.
* It supports modern browsers. Data is rendered with [d3.js](http://d3js.org/).
* It supports all popular modern desktop browsers: Chrome, Firefox, Safari,
Opera, Edge, and IE11.
* iD is not yet designed for mobile browsers, but this is something we hope to add!
* Data is rendered with [d3.js](https://d3js.org/).
## Participate!
* Read the project [Code of Conduct](CODE_OF_CONDUCT.md) and remember to be nice to one another.
* Read up on [Contributing and the code style of iD](CONTRIBUTING.md).
* See [open issues in the issue tracker](https://github.com/openstreetmap/iD/issues?state=open) if you're looking for something to do.
* [Translate!](https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating)
* See [open issues in the issue tracker](https://github.com/openstreetmap/iD/issues?state=open)
if you're looking for something to do.
* [Translate!](https://github.com/openstreetmap/iD/blob/develop/CONTRIBUTING.md#translating)
* Test a prerelease version of iD:
* Stable mirror of `release` branch: http://openstreetmap.us/iD/release
* Development mirror of `master` branch: http://openstreetmap.us/iD/master
* Stable mirror of `release` branch: https://preview.ideditor.com/release
* Development mirror of `develop` branch + latest translations: https://ideditor.netlify.com
* Development mirror of `v3-prototype` branch: https://preview.ideditor.com/master
Come on in, the water's lovely. More help? Ping `jfire` or `bhousel` on
[OpenStreetMap IRC](http://wiki.openstreetmap.org/wiki/IRC)
(`irc.oftc.net`, in `#iD` or `#osm-dev` or `#osm`) or on the [OpenStreetMap `dev` mailing list](http://wiki.openstreetmap.org/wiki/Mailing_lists).
Come on in, the water's lovely. More help? Ping `bhousel` or `quincylvania` on:
* [OpenStreetMap US Slack](https://slack.openstreetmap.us/)
(`#id` or `#general` channels)
* [OpenStreetMap IRC](https://wiki.openstreetmap.org/wiki/IRC)
(`irc.oftc.net`, in `#osm-dev` or `#osm`)
* [OpenStreetMap `dev` mailing list](https://wiki.openstreetmap.org/wiki/Mailing_lists)
## Prerequisites
* [Node.js](http://nodejs.org/) version 0.10.0 or newer
* Command line development tools (`make`, `git`, and a compiler) for your platform
* Ubuntu: `sudo apt-get install build-essential git`
* Mac OS X: Install Xcode and run `xcode-select --install` from a command line
* [Node.js](https://nodejs.org/) version 10 or newer
* [`git`](https://www.atlassian.com/git/tutorials/install-git/) for your platform
* Note for Windows users:
* Edit `$HOME\.gitconfig`:<br/>
Add these lines to avoid checking in files with CRLF newlines<br><pre>
[core]
autocrlf = input</pre>
## Installation
Note: Windows users should run these steps in a shell started with "Run as administrator".
This is only necessary the first time so that the build process can create symbolic links.
To run the current development version of iD on your own computer:
1. Create a local `git clone` of the project, then `cd` into the project folder
#### Cloning the repository
The repository is reasonably large, and it's unlikely that you need the full history (~200 MB). If you are happy to wait for it all to download, run:
```
git clone https://github.com/openstreetmap/iD.git
```
To clone only the most recent version, instead use a 'shallow clone':
```
git clone --depth=1 https://github.com/openstreetmap/iD.git
```
If you want to add in the full history later on, perhaps to run `git blame` or `git log`, run `git fetch --depth=1000000`
#### Building iD
1. `cd` into the newly cloned project folder
2. Run `npm install`
3. Run `make`
4. Start a local web server, e.g. `python -m SimpleHTTPServer`
5. Open `http://localhost:8000/` in a web browser
3. Run `npm run all`
3. Run `npm start`
4. Open `http://localhost:8080/` in a web browser
For guidance on building a packaged version, running tests, and contributing to
development, see [CONTRIBUTING.md](CONTRIBUTING.md).
## License
iD is available under the [ISC License](https://opensource.org/licenses/ISC).
It includes [d3.js](http://d3js.org/), which BSD-licensed.
See the [LICENSE.md](LICENSE.md) file for more details.
iD also bundles portions of the following open source software.
* [D3.js (BSD-3-Clause)](https://github.com/d3/d3)
* [CLDR (Unicode Consortium Terms of Use)](https://github.com/unicode-cldr/cldr-json)
* [editor-layer-index (CC-BY-SA 3.0)](https://github.com/osmlab/editor-layer-index)
* [Font Awesome (CC-BY 4.0)](https://fontawesome.com/license)
* [Maki (CC0 1.0)](https://github.com/mapbox/maki)
* [Mapillary JS (MIT)](https://github.com/mapillary/mapillary-js)
* [name-suggestion-index (BSD-3-Clause)](https://github.com/osmlab/name-suggestion-index)
* [osm-community-index (ISC)](https://github.com/osmlab/osm-community-index)
## Thank you
Initial development of iD was made possible by a [grant of the Knight Foundation](http://www.mapbox.com/blog/knight-invests-openstreetmap/).
Initial development of iD was made possible by a [grant of the Knight Foundation](https://www.mapbox.com/blog/knight-invests-openstreetmap/).
+64 -35
View File
@@ -1,46 +1,75 @@
## Release Checklist
### Prerelease (several days prior)
- [ ] Notify translators of impending release
- Notify translators of impending release
(https://www.transifex.com/projects/p/id-editor/announcements/)
- [ ] Notify TomH
- Notify TomH
### Update master branch
- [ ] `git checkout master`
- [ ] `make translations`
- [ ] `make imagery`
- [ ] `make suggestions`
- [ ] Update `CHANGELOG.md`
- [ ] Update version number in `id.js`, `package.json`
- [ ] `git add .`
- [ ] `git commit -m 'A.B.C'`
- [ ] `git push origin master`
### Prep
- If you don't have a `transifex.auth` file in the root of your iD checkout,
you'll need to create a Transifex account, ask @bhousel for admin rights
on the iD project, and then create this file with contents like<br><pre>
{"user": "yourusername", "password": "*******"}</pre>This file is not version-controlled and will not be checked in.
### Update and tag release branch
- [ ] `git checkout release`
- [ ] `git reset --hard master`
- [ ] `make`
- [ ] `git add -f dist/*.css dist/*.js dist/img/*.svg dist/locales/*.json`
- [ ] `git commit -m 'Check in build'`
- [ ] `git tag vA.B.C`
- [ ] `git push origin -f release vA.B.C`
### Update `iD`
### Update openstreetmap-website
#### Update `develop` branch
```bash
$ git checkout develop
$ rm -rf node_modules/editor-layer-index/
$ npm install
$ npm run imagery
$ npm run all
$ git add . && git commit -m 'npm run imagery'
$ npm run translations
$ git add . && git commit -m 'npm run translations'
```
#### Setup remotes (one time only)
- Update `CHANGELOG.md`
- Update version number in `modules/core/context.js`, `package.json`
- [ ] `git remote add osmlab git@github.com:osmlab/openstreetmap-website.git`
- [ ] `git remote add upstream git@github.com:openstreetmap/openstreetmap-website.git`
```bash
$ git add . && git commit -m 'vA.B.C'
$ git push origin develop
```
#### Sync master and update iD (every time)
#### Update and tag `release` branch
```bash
$ git checkout release
$ git reset --hard develop
$ npm run all
$ git add -f dist/*.css dist/*.js dist/data/* dist/img/*.svg dist/mapillary-js/ dist/pannellum-streetside/
$ git commit -m 'Check in build'
$ git tag vA.B.C
$ git push origin -f release vA.B.C
```
- Open https://github.com/openstreetmap/iD/tags
- Click `•••` > `Create Release` and link to `CHANGELOG.md` in `Describe this release`
- [ ] `bundle install`
- [ ] `git fetch --all`
- [ ] `git checkout master`
- [ ] `git reset --hard upstream/master`
- [ ] `git checkout -b iD-A.B.C`
- [ ] `rm -rf vendor/assets/iD/* && vendorer`
- [ ] `git add .`
- [ ] `git commit -m 'Update to iD vA.B.C'`
- [ ] `git push osmlab`
- [ ] Open pull request
### Update `openstreetmap-website`
#### Setup remotes (first time only)
```bash
$ git remote add osmlab git@github.com:osmlab/openstreetmap-website.git
$ git remote add upstream git@github.com:openstreetmap/openstreetmap-website.git
```
#### Sync develop branches
```bash
$ git fetch --all
$ git checkout develop
$ git reset --hard upstream/develop
$ git push osmlab develop
```
#### Create and push branch with the new iD version
```bash
$ git checkout -b iD-A.B.C
$ bundle install
$ rm -rf vendor/assets/iD/* && vendorer
$ git add . && git commit -m 'Update to iD vA.B.C'
$ git push osmlab
```
- [Open a pull request](https://github.com/openstreetmap/openstreetmap-website/compare/develop...osmlab:develop) using the [markdown text from the changelog](https://raw.githubusercontent.com/openstreetmap/iD/develop/CHANGELOG.md) as the description
-308
View File
@@ -1,308 +0,0 @@
var fs = require('fs'),
path = require('path'),
glob = require('glob'),
YAML = require('js-yaml'),
_ = require('./js/lib/lodash'),
jsonschema = require('jsonschema'),
fieldSchema = require('./data/presets/schema/field.json'),
presetSchema = require('./data/presets/schema/preset.json'),
suggestions = require('./data/name-suggestions.json');
function readtxt(f) {
return fs.readFileSync(f, 'utf8');
}
function read(f) {
return JSON.parse(readtxt(f));
}
function r(f) {
return read(__dirname + '/data/' + f);
}
function rp(f) {
return r('presets/' + f);
}
function validate(file, instance, schema) {
var result = jsonschema.validate(instance, schema);
if (result.length) {
console.error(file + ": ");
result.forEach(function(error) {
if (error.property) {
console.error(error.property + ' ' + error.message);
} else {
console.error(error);
}
});
process.exit(1);
}
}
var translations = {
categories: {},
fields: {},
presets: {}
};
function generateCategories() {
var categories = {};
glob.sync(__dirname + '/data/presets/categories/*.json').forEach(function(file) {
var field = read(file),
id = 'category-' + path.basename(file, '.json');
translations.categories[id] = {name: field.name};
categories[id] = field;
});
return categories;
}
function generateFields() {
var fields = {};
glob.sync(__dirname + '/data/presets/fields/**/*.json').forEach(function(file) {
var field = read(file),
id = file.match(/presets\/fields\/([^.]*)\.json/)[1];
validate(file, field, fieldSchema);
var t = translations.fields[id] = {
label: field.label
};
if (field.placeholder) {
t.placeholder = field.placeholder;
}
if (field.strings) {
for (var i in field.strings) {
t[i] = field.strings[i];
}
}
fields[id] = field;
});
return fields;
}
function suggestionsToPresets(presets) {
var existing = {};
for (var key in suggestions) {
for (var value in suggestions[key]) {
for (var name in suggestions[key][value]) {
var item = key + '/' + value + '/' + name,
tags = {},
count = suggestions[key][value][name].count;
if (existing[name] && count > existing[name].count) {
delete presets[existing[name].category];
delete existing[name];
}
if (!existing[name]) {
tags = _.extend({name: name}, suggestions[key][value][name].tags);
addSuggestion(item, tags, name, count);
}
}
}
}
function addSuggestion(category, tags, name, count) {
var tag = category.split('/'),
parent = presets[tag[0] + '/' + tag[1]];
presets[category] = {
tags: parent.tags ? _.merge(tags, parent.tags) : tags,
name: name,
icon: parent.icon,
geometry: parent.geometry,
fields: parent.fields,
suggestion: true
};
existing[name] = {
category: category,
count: count
};
}
return presets;
}
function generatePresets() {
var presets = {};
glob.sync(__dirname + '/data/presets/presets/**/*.json').forEach(function(file) {
var preset = read(file),
id = file.match(/presets\/presets\/([^.]*)\.json/)[1];
validate(file, preset, presetSchema);
translations.presets[id] = {
name: preset.name,
terms: (preset.terms || []).join(',')
};
presets[id] = preset;
});
presets = _.merge(presets, suggestionsToPresets(presets));
return presets;
}
function generateTranslate(fields, presets) {
var translate = _.cloneDeep(translations);
_.forEach(translate.fields, function(field, id) {
var f = fields[id];
if (f.keys) {
field['label#'] = _.each(f.keys).map(function(key) { return key + '=*'; }).join(', ');
if (!_.isEmpty(field.options)) {
_.each(field.options, function(v,k) {
if (id === 'access') {
field.options[k]['title#'] = field.options[k]['description#'] = 'access=' + k;
} else {
field.options[k + '#'] = k + '=yes';
}
});
}
} else if (f.key) {
field['label#'] = f.key + '=*';
if (!_.isEmpty(field.options)) {
_.each(field.options, function(v,k) {
field.options[k + '#'] = f.key + '=' + k;
});
}
}
if (f.placeholder) {
field['placeholder#'] = id + ' field placeholder';
}
});
_.forEach(translate.presets, function(preset, id) {
var p = presets[id];
if (!_.isEmpty(p.tags))
preset['name#'] = _.pairs(p.tags).map(function(pair) { return pair[0] + '=' + pair[1]; }).join(', ');
if (p.terms && p.terms.length)
preset['terms#'] = 'terms: ' + p.terms.join();
preset.terms = "<translate with synonyms or related terms for '" + preset.name + "', separated by commas>";
});
return translate;
}
function validateCategoryPresets(categories, presets) {
_.forEach(categories, function(category) {
if (category.members) {
category.members.forEach(function(preset) {
if (presets[preset] === undefined) {
console.error('Unknown preset: ' + preset + ' in category ' + category.name);
process.exit(1);
}
});
}
});
}
function validatePresetFields(presets, fields) {
_.forEach(presets, function(preset) {
if (preset.fields) {
preset.fields.forEach(function(field) {
if (fields[field] === undefined) {
console.error('Unknown preset field: ' + field + ' in preset ' + preset.name);
process.exit(1);
}
});
}
});
}
// comment keys end with '#' and should sort immediately before their related key.
function sortKeys(a, b) {
return (a === b + '#') ? -1
: (b === a + '#') ? 1
: (a > b ? 1 : a < b ? -1 : 0);
}
var categories = generateCategories(),
fields = generateFields(),
presets = generatePresets(),
translate = generateTranslate(fields, presets);
// additional consistency checks
validateCategoryPresets(categories, presets);
validatePresetFields(presets, fields);
// Save individual data files
fs.writeFileSync('data/presets/categories.json', JSON.stringify(categories, null, 4));
fs.writeFileSync('data/presets/fields.json', JSON.stringify(fields, null, 4));
fs.writeFileSync('data/presets/presets.json', JSON.stringify(presets, null, 4));
fs.writeFileSync('data/presets.yaml',
YAML.dump({en: {presets: translate}}, {sortKeys: sortKeys})
.replace(/\'.*#\':/g, '#')
);
// Write taginfo data
var taginfo = {
"data_format": 1,
"data_url": "https://raw.githubusercontent.com/openstreetmap/iD/master/data/taginfo.json",
"project": {
"name": "iD Editor",
"description": "Online editor for OSM data.",
"project_url": "https://github.com/openstreetmap/iD",
"doc_url": "https://github.com/openstreetmap/iD/blob/master/data/presets/README.md",
"icon_url": "https://raw.githubusercontent.com/openstreetmap/iD/master/dist/img/logo.png",
"keywords": [
"editor"
]
},
"tags": []
};
_.forEach(presets, function(preset) {
if (preset.suggestion)
return;
var keys = Object.keys(preset.tags),
last = keys[keys.length - 1],
tag = {key: last};
if (!last)
return;
if (preset.tags[last] !== '*') {
tag.value = preset.tags[last];
}
taginfo.tags.push(tag);
});
fs.writeFileSync('data/taginfo.json', JSON.stringify(taginfo, null, 4));
// Push changes from data/core.yaml into en.json
var core = YAML.load(fs.readFileSync('data/core.yaml', 'utf8'));
var presets = {en: {presets: translations}};
var en = _.merge(core, presets);
fs.writeFileSync('dist/locales/en.json', JSON.stringify(en.en, null, 4));
fs.writeFileSync('data/data.js', 'iD.data = ' + JSON.stringify({
deprecated: r('deprecated.json'),
discarded: r('discarded.json'),
wikipedia: r('wikipedia.json'),
imperial: r('imperial.json'),
featureIcons: r('feature-icons.json'),
locales: r('locales.json'),
en: read('dist/locales/en.json'),
suggestions: r('name-suggestions.json'),
addressFormats: r('address-formats.json')
}) + ';');
fs.writeFileSync('dist/presets.js', 'iD.data.presets = ' + JSON.stringify({
presets: rp('presets.json'),
defaults: rp('defaults.json'),
categories: rp('categories.json'),
fields: rp('fields.json')
}) + ';');
fs.writeFileSync('dist/imagery.js', 'iD.data.imagery = ' + JSON.stringify(r('imagery.json')) + ';');
+41
View File
@@ -0,0 +1,41 @@
/* eslint-disable no-console */
import commonjs from '@rollup/plugin-commonjs';
import includePaths from 'rollup-plugin-includepaths';
import json from '@rollup/plugin-json';
import nodeResolve from '@rollup/plugin-node-resolve';
import progress from 'rollup-plugin-progress';
// The "dev" build includes all modules in a single bundle - for now
// * Skips transpilation (so it includes ES6 code and must run in a modern browser)
// * Also generates sourcemaps
export default {
input: './modules/id.js',
onwarn: onWarn,
output: {
file: 'dist/iD.js',
format: 'iife',
sourcemap: true,
strict: false
},
plugins: [
progress(),
includePaths({
paths: ['node_modules/d3/node_modules'] // npm2 or windows
}),
nodeResolve({ dedupe: ['object-inspect'] }),
commonjs(),
json({ indent: '' })
]
};
function onWarn(warning, warn) {
// skip certain warnings
if (warning.code === 'CIRCULAR_DEPENDENCY') return;
if (warning.code === 'EVAL') return;
// Use default for everything else
console.log(warning.code);
warn(warning);
}
+43
View File
@@ -0,0 +1,43 @@
/* eslint-disable no-console */
import buble from '@rollup/plugin-buble';
import commonjs from '@rollup/plugin-commonjs';
import includePaths from 'rollup-plugin-includepaths';
import json from '@rollup/plugin-json';
import progress from 'rollup-plugin-progress';
import nodeResolve from '@rollup/plugin-node-resolve';
// The "legacy" build includes all modules in a single bundle:
// * Runs `buble` to transpile ES6 -> ES5 (needed for IE11 and PhantomJS)
// * No sourcemaps
export default {
input: './modules/id.js',
onwarn: onWarn,
output: {
file: 'dist/iD.legacy.js',
format: 'iife',
sourcemap: false,
strict: false
},
plugins: [
progress(),
includePaths({
paths: ['node_modules/d3/node_modules'] // npm2 or windows
}),
nodeResolve({ dedupe: ['object-inspect'] }),
commonjs(),
json({ indent: '' }),
buble()
]
};
function onWarn(warning, warn) {
// skip certain warnings
if (warning.code === 'CIRCULAR_DEPENDENCY') return;
if (warning.code === 'EVAL') return;
// Use default for everything else
console.log(warning.code);
warn(warning);
}
+45
View File
@@ -0,0 +1,45 @@
/* eslint-disable no-console */
import commonjs from '@rollup/plugin-commonjs';
import includePaths from 'rollup-plugin-includepaths';
import json from '@rollup/plugin-json';
import nodeResolve from '@rollup/plugin-node-resolve';
import progress from 'rollup-plugin-progress';
import visualizer from 'rollup-plugin-visualizer';
// The "stats" build is just like the "dev" build,
// but it includes the visualizer plugin to generate a statistics page (slow)
export default {
input: './modules/id.js',
onwarn: onWarn,
output: {
file: 'dist/iD.js',
format: 'iife',
sourcemap: true,
strict: false
},
plugins: [
progress(),
includePaths({
paths: ['node_modules/d3/node_modules'] // npm2 or windows
}),
nodeResolve({ dedupe: ['object-inspect'] }),
commonjs(),
json({ indent: '' }),
visualizer({
filename: 'docs/statistics.html',
sourcemap: true
})
]
};
function onWarn(warning, warn) {
// skip certain warnings
if (warning.code === 'CIRCULAR_DEPENDENCY') return;
if (warning.code === 'EVAL') return;
// Use default for everything else
console.log(warning.code);
warn(warning);
}
+7 -12
View File
@@ -3,7 +3,7 @@
License: none (public domain)
*/
html, body, div, span, applet, object, iframe,
div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, img, ins, kbd, q, s, samp,
@@ -28,9 +28,6 @@ article, aside, details, figcaption, figure,
footer, header, hgroup, menu, nav, section {
display: block;
}
body {
line-height: 1;
}
ol, ul {
list-style: none;
}
@@ -80,19 +77,17 @@ display: none;
}
/*
* 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
* and `video` controls.
* 2. Corrects inability to style clickable `input` types in iOS.
* 3. Improves usability and consistency of cursor style between image-type
* 1. Corrects inability to style clickable `input` types in iOS.
* 2. Improves usability and consistency of cursor style between image-type
* `input` and others.
*/
button,
html input[type="button"], /* 1 */
input[type="button"],
input[type="reset"],
input[type="submit"] {
-webkit-appearance: button; /* 2 */
cursor: pointer; /* 3 */
-webkit-appearance: button; /* 1 */
cursor: pointer; /* 2 */
}
/*
@@ -122,7 +117,7 @@ input[type="radio"] {
*/
input[type="search"] {
-webkit-appearance: textfield; /* 1 */
-webkit-appearance: none; /* 1 */
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box; /* 2 */
box-sizing: border-box;
+433
View File
@@ -0,0 +1,433 @@
/* base styles */
.layer-osm path {
fill: none;
}
/* IE/Edge needs these overrides for markers to show up */
.layer-osm path.oneway-marker-path { fill: #000; }
.layer-osm path.sided-marker-natural-path { fill: rgb(170, 170, 170); }
.layer-osm path.sided-marker-coastline-path { fill: #77dede; }
.layer-osm path.sided-marker-barrier-path { fill: #ddd; }
.layer-osm path.sided-marker-man_made-path { fill: #fff; }
/* IE/Edge rule for <use> marker style */
.layer-osm path.viewfield-marker-path {
fill: #333;
fill-opacity: 0.75;
stroke: #fff;
stroke-width: 0.5px;
stroke-opacity: 0.75;
}
.fill-wireframe .layer-osm path.viewfield-marker-path { /* IE/Edge rule for <use> marker style */
fill: none;
}
/* the above fill: none rule affects paths in <use> shadow dom only in Firefox */
.layer-osm use.icon path { fill: #333; } /* FF svg Maki icons */
.layer-osm .turn use path { fill: #000; } /* FF turn restriction icons */
#turn-only-shape2, #turn-only-u-shape2 { fill: #7092ff; } /* FF turn-only, turn-only-u */
#turn-no-shape2, #turn-no-u-shape2 { fill: #e06d5f; } /* FF turn-no, turn-no-u */
#turn-yes-shape2, #turn-yes-u-shape2 { fill: #8cd05f; } /* FF turn-yes, turn-yes-u */
/* No interactivity except what we specifically allow */
.data-layer.osm *,
.data-layer.notes *,
.data-layer.keepRight *,
.data-layer.improveOSM * {
pointer-events: none;
}
.lasso .main-map {
pointer-events: visibleStroke;
}
/* `.target` objects are interactive */
/* They can be picked up, clicked, hovered, or things can connect to them */
.qaItem.target,
.note.target,
.node.target,
.turn .target {
pointer-events: fill;
fill-opacity: 0.8;
fill: currentColor;
stroke: none;
}
.way.target {
pointer-events: stroke;
fill: none;
stroke-width: 12;
stroke-opacity: 0.8;
stroke: currentColor;
stroke-linecap: round;
stroke-linejoin: round;
}
/* `.target-nope` objects are explicitly forbidden to join to */
.surface:not(.nope-disabled) .node.target.target-nope,
.surface:not(.nope-disabled) .way.target.target-nope {
cursor: not-allowed;
}
/* `.active` objects (currently being drawn or dragged) are not interactive */
/* This is important to allow the events to drop through to whatever is */
/* below them on the map, so you can still hover and connect to other things. */
.layer-osm .active {
pointer-events: none !important;
}
/* points, notes & QA */
/* points, notes, markers */
g.qaItem .stroke,
g.note .stroke {
stroke: #222;
stroke-width: 1;
fill: #222;
opacity: 0.6;
}
g.qaItem.active .stroke,
g.note.active .stroke {
stroke: #222;
stroke-width: 1;
fill: #222;
opacity: 0.8;
}
g.point .stroke {
stroke: #444;
stroke-width: 1;
fill: #fff;
}
g.qaItem .shadow,
g.point .shadow,
g.note .shadow {
fill: none;
stroke: #f6634f;
stroke-width: 16;
stroke-opacity: 0;
}
g.qaItem.hover:not(.selected) .shadow,
g.note.hover:not(.selected) .shadow,
g.point.related:not(.selected) .shadow,
g.point.hover:not(.selected) .shadow {
stroke-opacity: 0.5;
}
g.qaItem.selected .shadow,
g.note.selected .shadow,
g.point.selected .shadow {
stroke-opacity: 0.7;
}
/* g.note ellipse.stroke, */
g.point ellipse.stroke {
display: none;
}
.ideditor.mode-drag-note g.note.active ellipse.stroke,
.ideditor.mode-drag-node g.point.active ellipse.stroke {
display: block;
}
/* vertices and midpoints */
g.vertex .fill {
fill: #000;
}
g.vertex .stroke {
stroke: #666;
stroke-width: 1;
fill: white;
}
g.vertex.shared .stroke {
fill: #bbb;
}
g.midpoint .fill {
fill: #eee;
stroke: #444;
stroke-opacity: .6;
opacity: .7;
}
g.vertex .shadow,
g.midpoint .shadow {
stroke-width: 6;
fill: #f6634f;
fill-opacity: 0;
}
g.vertex.related:not(.selected) .shadow,
g.vertex.hover:not(.selected) .shadow,
g.midpoint.related:not(.selected) .shadow,
g.midpoint.hover:not(.selected) .shadow {
fill-opacity: 0.5;
}
g.vertex.selected .shadow {
fill-opacity: 0.7;
}
/* lines */
.preset-icon .icon.iD-other-line {
color: #989898;
}
.preset-icon-container path.line.casing {
stroke: #afafaf;
}
path.line {
stroke-linecap: round;
stroke-linejoin: round;
}
path.stroke {
stroke: #000;
stroke-width: 4;
}
path.shadow {
stroke: #f6634f;
stroke-width: 16;
stroke-opacity: 0;
stroke-linecap: round;
stroke-linejoin: round;
}
path.shadow.related:not(.selected),
path.shadow.hover:not(.selected) {
stroke-opacity: 0.4;
}
path.shadow.selected {
stroke-opacity: 0.7;
}
path.line.stroke {
stroke: #fff;
stroke-width: 2;
}
/* Labels / Markers */
text {
font-size: 10px;
color: #222;
opacity: 1;
}
.oneway .textpath.tag-waterway {
fill: #002F35;
}
.onewaygroup path.oneway,
.viewfieldgroup path.viewfield,
.sidedgroup path.sided {
stroke-width: 6px;
}
text.arealabel-halo,
text.linelabel-halo,
text.pointlabel-halo,
text.arealabel,
text.linelabel,
text.pointlabel {
dominant-baseline: middle;
text-anchor: middle;
font-size: 12px;
font-weight: bold;
fill: #333;
-webkit-transition: opacity 100ms linear;
transition: opacity 100ms linear;
-moz-transition: opacity 100ms linear;
}
/* Opera doesn't support dominant-baseline. See #715 */
/* Safari 10 seems to have regressed too */
.linelabel-halo .textpath,
.linelabel .textpath {
baseline-shift: -33%;
dominant-baseline: auto;
}
.labels-group.halo text {
opacity: 0.7;
stroke: #fff;
stroke-width: 5px;
stroke-miterlimit: 1;
}
text.nolabel {
opacity: 0 !important;
}
text.point {
font-size: 10px;
}
.icon.areaicon-halo {
opacity: 0.6;
stroke: #999;
stroke-width: 2px;
stroke-miterlimit: 1;
}
.icon.areaicon {
fill: #222;
opacity: 0.8;
}
/* Wikidata-tagged */
g.point.tag-wikidata path.stroke {
stroke-width: 2px;
stroke: #666;
fill: #eee;
}
g.point.tag-wikidata .icon {
color: #666;
}
/* Selected Members */
g.vertex.selected-member .shadow,
g.point.selected-member .shadow,
path.shadow.selected-member {
stroke-opacity: 0.95;
stroke: #FFDE70;
}
/* Highlighting */
g.point.highlighted .shadow,
path.shadow.highlighted {
stroke-opacity: 0.95;
stroke: #7092ff;
}
g.vertex.highlighted .shadow {
stroke-width: 7;
stroke-opacity: 0.95;
stroke: #7092ff;
}
/* Turn Restrictions */
.points-group.turns g.turn rect,
.points-group.turns g.turn circle {
fill: none;
}
/* Turn restriction paths and vertices */
.surface.tr .way.target,
.surface.tr path.shadow.selected,
.surface.tr path.shadow.related {
stroke-width: 25px;
}
.surface.tr path.shadow.selected,
.surface.tr path.shadow.related,
.surface.tr g.vertex.selected .shadow,
.surface.tr g.vertex.related .shadow {
stroke-opacity: 0.7;
stroke: #777;
}
.surface.tr path.shadow.related.allow,
.surface.tr g.vertex.related.allow .shadow {
stroke: #5b3;
}
.surface.tr path.shadow.related.restrict,
.surface.tr g.vertex.related.restrict .shadow {
stroke: #d53;
}
.surface.tr path.shadow.related.only,
.surface.tr g.vertex.related.only .shadow {
stroke: #68f;
}
/* Visual Diffs
------------------
`highlight-edited` - visual diff activated
`added` - entity was created by the user
`moved` - node has different coordinates
`geometry-edited` - way has different nodes
`segment-edited` - one or both adjacents nodes moved
`retagged` - some tagging change has occurred
*/
/* Vertex visual diffs */
.highlight-edited g.points g.node.vertex.added > circle.shadow,
.highlight-edited g.points g.node.vertex.retagged > circle.shadow,
.highlight-edited g.points g.node.vertex.moved > circle.shadow {
fill-opacity: 0.8;
}
.highlight-edited g.points g.node.vertex.added > circle.shadow {
fill: rgb(133, 255, 103);
}
.highlight-edited g.points g.node.vertex.retagged > circle.shadow {
fill: #fcde5a;
}
.highlight-edited g.points g.node.vertex.moved > circle.shadow {
fill: rgb(255, 126, 46);
}
/* Point visual diffs */
.highlight-edited g.points g.node.point.added > path.shadow,
.highlight-edited g.points g.node.point.retagged > path.shadow,
.highlight-edited g.points g.node.point.moved > path.shadow {
stroke-opacity: 0.8;
stroke-width: 10;
}
.highlight-edited g.points g.node.point.added > path.shadow {
stroke: rgb(133, 255, 103);
}
.highlight-edited g.points g.node.point.retagged > path.shadow {
stroke: #fcde5a;
}
.highlight-edited g.points g.node.point.moved > path.shadow {
stroke: rgb(255, 126, 46);
}
/* Line/area segment visual diffs
- segments are rendered on top of the ways for convenience and to differentiate
them from entire line diffs, so make them thin
*/
.highlight-edited g.lines > path.line.segment-edited,
.highlight-edited g.areas > path.area.segment-edited {
stroke: rgb(255, 126, 46);
stroke-dasharray: 10, 3;
stroke-width: 1.5 !important;
stroke-opacity: 1;
}
/* Entire line/area visual diffs */
.highlight-edited path.line.shadow.added,
.highlight-edited path.line.shadow.retagged,
.highlight-edited path.line.shadow.geometry-edited,
.highlight-edited path.area.shadow.added,
.highlight-edited path.area.shadow.retagged,
.highlight-edited path.area.shadow.geometry-edited {
stroke-opacity: 0.6;
}
.highlight-edited.fill-wireframe path.line.shadow.added,
.highlight-edited.fill-wireframe path.line.shadow.retagged,
.highlight-edited.fill-wireframe path.line.shadow.geometry-edited,
.highlight-edited.fill-wireframe path.area.shadow.added,
.highlight-edited.fill-wireframe path.area.shadow.retagged,
.highlight-edited.fill-wireframe path.area.shadow.geometry-edited {
stroke-width: 3;
}
.highlight-edited path.line.shadow.added,
.highlight-edited path.area.shadow.added {
stroke: rgb(133, 255, 103);
}
.highlight-edited path.area.shadow.retagged,
.highlight-edited path.line.shadow.retagged {
stroke: #fcde5a;
}
.highlight-edited path.line.shadow.geometry-edited,
.highlight-edited path.area.shadow.geometry-edited {
stroke: rgb(255, 126, 46);
}
+327
View File
@@ -0,0 +1,327 @@
/* Default - light gray */
path.area.stroke {
stroke: rgb(170, 170, 170);
stroke-width: 1;
}
path.area.fill {
stroke-width: 0;
stroke: rgba(255, 255, 255, 0.3);
fill: rgba(255, 255, 255, 0.3);
fill-rule: evenodd;
}
.preset-icon-fill path.fill {
stroke: rgb(170, 170, 170);
fill: rgba(170, 170, 170, 0.3);
}
path.shadow.old-multipolygon,
path.stroke.old-multipolygon {
stroke-dasharray: 100, 5;
stroke-linecap: butt;
}
/* Green things */
path.stroke.tag-barrier-hedge,
path.stroke.tag-landuse-flowerbed,
path.stroke.tag-landuse-forest,
path.stroke.tag-landuse-grass,
path.stroke.tag-landuse-recreation_ground,
path.stroke.tag-landuse-village_green,
path.stroke.tag-leisure-garden,
path.stroke.tag-leisure-golf_course,
path.stroke.tag-leisure-nature_reserve,
path.stroke.tag-leisure-park,
path.stroke.tag-leisure-pitch,
path.stroke.tag-leisure-track,
path.stroke.tag-natural,
path.stroke.tag-natural-wood {
stroke: rgb(140, 208, 95);
}
path.fill.tag-barrier-hedge,
path.fill.tag-landuse-flowerbed,
path.fill.tag-landuse-forest,
path.fill.tag-landuse-grass,
path.fill.tag-landuse-recreation_ground,
path.fill.tag-landuse-village_green,
path.fill.tag-leisure-garden,
path.fill.tag-leisure-golf_course,
path.fill.tag-leisure-nature_reserve,
path.fill.tag-leisure-park,
path.fill.tag-leisure-pitch,
path.fill.tag-leisure-track,
path.fill.tag-natural,
path.fill.tag-natural-wood {
stroke: rgba(140, 208, 95, 0.3);
fill: rgba(140, 208, 95, 0.3);
}
.pattern-color-forest,
.pattern-color-forest_broadleaved,
.pattern-color-forest_needleleaved,
.pattern-color-forest_leafless,
.pattern-color-wood,
.pattern-color-grass {
fill: rgba(140, 208, 95, 0.3);
}
/* Blue things */
path.stroke.tag-amenity-fountain,
path.stroke.tag-leisure-swimming_pool,
path.stroke.tag-natural-bay,
path.stroke.tag-natural-water {
stroke: rgb(119, 211, 222);
}
path.fill.tag-amenity-fountain,
path.fill.tag-leisure-swimming_pool,
path.fill.tag-natural-bay,
path.fill.tag-natural-water {
stroke: rgba(119, 211, 222, 0.3);
fill: rgba(119, 211, 222, 0.3);
}
.pattern-color-waves,
.pattern-color-water_standing,
.pattern-color-pond {
fill: rgba(119, 211, 222, 0.3);
}
/* Yellow things */
path.stroke.tag-leisure-pitch.tag-sport-beachvolleyball,
path.stroke.tag-leisure-pitch.tag-sport-baseball,
path.stroke.tag-leisure-pitch.tag-sport-softball,
path.stroke.tag-leisure-track,
path.stroke.tag-natural-beach,
path.stroke.tag-natural-sand,
path.stroke.tag-natural-scrub,
path.stroke.tag-amenity-childcare,
path.stroke.tag-amenity-kindergarten,
path.stroke.tag-amenity-school,
path.stroke.tag-amenity-college,
path.stroke.tag-amenity-university,
path.stroke.tag-amenity-research_institute {
stroke: rgba(255, 255, 148, 0.75);
}
path.fill.tag-leisure-pitch.tag-sport-beachvolleyball,
path.fill.tag-leisure-pitch.tag-sport-baseball,
path.fill.tag-leisure-pitch.tag-sport-softball,
path.fill.tag-leisure-track,
path.fill.tag-natural-beach,
path.fill.tag-natural-sand,
path.fill.tag-natural-scrub,
path.fill.tag-amenity-childcare,
path.fill.tag-amenity-kindergarten,
path.fill.tag-amenity-school,
path.fill.tag-amenity-college,
path.fill.tag-amenity-university,
path.fill.tag-amenity-research_institute {
stroke: rgba(255, 255, 148, 0.25);
fill: rgba(255, 255, 148, 0.25);
}
.preset-icon-fill path.area.stroke.tag-leisure-pitch.tag-sport-beachvolleyball,
.preset-icon-fill path.area.stroke.tag-leisure-pitch.tag-sport-baseball,
.preset-icon-fill path.area.stroke.tag-leisure-pitch.tag-sport-softball,
.preset-icon-fill path.area.stroke.tag-leisure-track,
.preset-icon-fill path.area.stroke.tag-natural-beach,
.preset-icon-fill path.area.stroke.tag-natural-sand,
.preset-icon-fill path.area.stroke.tag-natural-scrub,
.preset-icon-fill path.area.stroke.tag-amenity-childcare,
.preset-icon-fill path.area.stroke.tag-amenity-kindergarten,
.preset-icon-fill path.area.stroke.tag-amenity-school,
.preset-icon-fill path.area.stroke.tag-amenity-college,
.preset-icon-fill path.area.stroke.tag-amenity-university,
.preset-icon-fill path.area.stroke.tag-amenity-research_institute {
stroke: rgb(232, 232, 0);
}
.pattern-color-beach,
.pattern-color-sand,
.pattern-color-scrub {
fill: rgba(255, 255, 148, 0.2);
}
/* Gold things */
path.stroke.tag-landuse-residential,
path.stroke.tag-status-construction {
stroke: rgb(196, 189, 25);
}
path.fill.tag-landuse-residential,
path.fill.tag-status-construction {
stroke: rgba(196, 189, 25, 0.3);
fill: rgba(196, 189, 25, 0.3);
}
.pattern-color-construction {
fill: rgba(196, 189, 25, 0.3);
}
/* Orange things */
path.stroke.tag-landuse-retail,
path.stroke.tag-landuse-commercial,
path.stroke.tag-landuse-landfill,
path.stroke.tag-military,
path.stroke.tag-landuse-military {
stroke: rgb(214, 136, 26);
}
path.fill.tag-landuse-retail,
path.fill.tag-landuse-commercial,
path.fill.tag-landuse-landfill,
path.fill.tag-military,
path.fill.tag-landuse-military {
stroke: rgba(214, 136, 26, 0.3);
fill: rgba(214, 136, 26, 0.3);
}
.pattern-color-landfill {
fill: rgba(214, 136, 26, 0.3);
}
/* Pink things */
path.stroke.tag-landuse-industrial,
path.stroke.tag-power-plant {
stroke: rgb(228, 164, 245);
}
path.fill.tag-landuse-industrial,
path.fill.tag-power-plant {
stroke: rgba(228, 164, 245, 0.3);
fill: rgba(228, 164, 245, 0.3);
}
/* Teal things */
path.stroke.tag-natural-wetland {
stroke: rgb(153, 225, 170);
}
path.fill.tag-natural-wetland {
stroke: rgba(153, 225, 170, 0.3);
fill: rgba(153, 225, 170, 0.3);
}
.preset-icon-fill path.area.fill.tag-natural-wetland {
fill: rgba(153, 225, 170, 0.2);
}
.pattern-color-wetland,
.pattern-color-wetland_marsh,
.pattern-color-wetland_swamp,
.pattern-color-wetland_bog,
.pattern-color-wetland_reedbed {
fill: rgba(153, 225, 170, 0.3);
}
/* Light Green things */
path.stroke.tag-landuse-cemetery,
path.stroke.tag-landuse-farmland,
path.stroke.tag-landuse-grass.tag-golf-green,
path.stroke.tag-landuse-meadow,
path.stroke.tag-landuse-orchard,
path.stroke.tag-landuse-vineyard {
stroke: rgb(191, 232, 63);
}
path.fill.tag-landuse-cemetery,
path.fill.tag-landuse-farmland,
path.fill.tag-landuse-grass.tag-golf-green,
path.fill.tag-landuse-meadow,
path.fill.tag-landuse-orchard,
path.fill.tag-landuse-vineyard {
stroke: rgba(191, 232, 63, 0.3);
fill: rgba(191, 232, 63, 0.3);
}
.preset-icon-fill path.area.fill.tag-landuse-cemetery,
.preset-icon-fill path.area.fill.tag-landuse-farmland,
.preset-icon-fill path.area.fill.tag-landuse-grass.tag-golf-green,
.preset-icon-fill path.area.fill.tag-landuse-meadow,
.preset-icon-fill path.area.fill.tag-landuse-orchard,
.preset-icon-fill path.area.fill.tag-landuse-vineyard {
fill: rgba(191, 232, 63, 0.4);
}
.pattern-color-cemetery,
.pattern-color-cemetery_buddhist,
.pattern-color-cemetery_christian,
.pattern-color-cemetery_jewish,
.pattern-color-cemetery_muslim,
.pattern-color-farmland,
.pattern-color-golf_green,
.pattern-color-meadow,
.pattern-color-orchard,
.pattern-color-vineyard {
fill: rgba(191, 232, 63, 0.3);
}
/* Tan things */
path.stroke.tag-landuse-farmyard {
stroke: rgb(245, 220, 186);
}
path.fill.tag-landuse-farmyard {
stroke: rgba(245, 220, 186, 0.3);
fill: rgba(245, 220, 186, 0.3);
}
.preset-icon-fill path.area.stroke.tag-landuse-farmyard {
stroke: rgb(226, 177, 111);
}
.pattern-color-farmyard {
fill: rgba(245, 220, 186, 0.3);
}
/* Dark Gray things */
path.stroke.tag-amenity-parking,
path.stroke.tag-landuse-railway,
path.stroke.tag-landuse-quarry,
path.stroke.tag-leisure-pitch.tag-sport-basketball,
path.stroke.tag-leisure-pitch.tag-sport-skateboard,
path.stroke.tag-man_made-adit,
path.stroke.tag-man_made-groyne,
path.stroke.tag-man_made-breakwater,
path.stroke.tag-natural-bare_rock,
path.stroke.tag-natural-cave_entrance,
path.stroke.tag-natural-cliff,
path.stroke.tag-natural-rock,
path.stroke.tag-natural-scree,
path.stroke.tag-natural-stone,
path.stroke.tag-natural-shingle,
path.stroke.tag-waterway-dam,
path.stroke.tag-waterway-weir {
stroke: rgb(170, 170, 170);
}
path.fill.tag-amenity-parking,
path.fill.tag-landuse-railway,
path.fill.tag-landuse-quarry,
path.fill.tag-leisure-pitch.tag-sport-basketball,
path.fill.tag-leisure-pitch.tag-sport-skateboard,
path.fill.tag-man_made-adit,
path.fill.tag-man_made-groyne,
path.fill.tag-man_made-breakwater,
path.fill.tag-natural-bare_rock,
path.fill.tag-natural-cliff,
path.fill.tag-natural-cave_entrance,
path.fill.tag-natural-rock,
path.fill.tag-natural-scree,
path.fill.tag-natural-stone,
path.fill.tag-natural-shingle,
path.fill.tag-waterway-dam,
path.fill.tag-waterway-weir {
stroke: rgba(140, 140, 140, 0.5);
fill: rgba(140, 140, 140, 0.5);
}
.pattern-color-quarry {
fill: rgba(140, 140, 140, 0.5);
}
/* Light gray overrides */
path.stroke.tag-natural-cave_entrance,
path.stroke.tag-natural-glacier {
stroke: rgb(170, 170, 170);
}
path.fill.tag-natural-cave_entrance,
path.fill.tag-natural-glacier {
stroke: rgba(255, 255, 255, 0.3);
fill: rgba(255, 255, 255, 0.3);
}
.preset-icon-fill path.fill.tag-natural-cave_entrance,
.preset-icon-fill path.fill.tag-natural-glacier {
stroke: rgb(170, 170, 170);
fill: rgba(170, 170, 170, 0.3);
}
+622
View File
@@ -0,0 +1,622 @@
preset-icon-container/* highways */
/* defaults */
.preset-icon .icon.tag-highway.other-line {
color: #fff;
fill: #777;
}
path.line.casing.tag-highway {
stroke: #444;
}
path.line.stroke.tag-highway {
stroke: #ccc;
}
/* wide highways */
path.line.shadow.tag-highway {
stroke-width: 20;
}
path.line.casing.tag-highway {
stroke-width: 10;
}
path.line.stroke.tag-highway {
stroke-width: 8;
}
.low-zoom path.line.shadow.tag-highway {
stroke-width: 16;
}
.low-zoom path.line.casing.tag-highway {
stroke-width: 7;
}
.low-zoom path.line.stroke.tag-highway {
stroke-width: 5;
}
.preset-icon .icon.tag-highway-motorway,
.preset-icon .icon.tag-highway-motorway_link {
color: #CF2081;
fill: #70372f;
}
path.line.stroke.tag-highway-motorway,
path.line.stroke.tag-highway-motorway_link,
path.line.stroke.tag-motorway {
stroke: #CF2081;
}
path.line.casing.tag-highway-motorway,
path.line.casing.tag-highway-motorway_link,
path.line.casing.tag-motorway {
stroke: #70372f;
}
.preset-icon .icon.tag-highway-trunk,
.preset-icon .icon.tag-highway-trunk_link {
color: #DD2F22;
fill: #70372f;
}
path.line.stroke.tag-highway-trunk,
path.line.stroke.tag-highway-trunk_link,
path.line.stroke.tag-trunk {
stroke: #DD2F22;
}
path.line.casing.tag-highway-trunk,
path.line.casing.tag-highway-trunk_link,
path.line.casing.tag-trunk {
stroke: #70372f;
}
.preset-icon .icon.tag-highway-primary,
.preset-icon .icon.tag-highway-primary_link {
color: #F99806;
fill: #70372f;
}
path.line.stroke.tag-highway-primary,
path.line.stroke.tag-highway-primary_link,
path.line.stroke.tag-primary {
stroke: #F99806;
}
path.line.casing.tag-highway-primary,
path.line.casing.tag-highway-primary_link,
path.line.casing.tag-primary {
stroke: #70372f;
}
.preset-icon .icon.tag-highway-secondary,
.preset-icon .icon.tag-highway-secondary_link {
color: #F3F312;
fill: #70372f;
}
path.line.stroke.tag-highway-secondary,
path.line.stroke.tag-highway-secondary_link,
path.line.stroke.tag-secondary {
stroke: #F3F312;
}
path.line.casing.tag-highway-secondary,
path.line.casing.tag-highway-secondary_link,
path.line.casing.tag-secondary {
stroke: #70372f;
}
.preset-icon .icon.tag-highway-tertiary,
.preset-icon .icon.tag-highway-tertiary_link {
color: #FFF9B3;
fill: #70372f;
}
path.line.stroke.tag-highway-tertiary,
path.line.stroke.tag-highway-tertiary_link,
path.line.stroke.tag-tertiary {
stroke: #FFF9B3;
}
path.line.casing.tag-highway-tertiary,
path.line.casing.tag-highway-tertiary_link,
path.line.casing.tag-tertiary {
stroke: #70372f;
}
.legacy-carto .preset-icon .icon.tag-highway-motorway,
.legacy-carto .preset-icon .icon.tag-highway-motorway_link {
color: #58a9ed;
fill: #2c5476;
}
.legacy-carto path.line.stroke.tag-highway-motorway,
.legacy-carto path.line.stroke.tag-highway-motorway_link,
.legacy-carto path.line.stroke.tag-motorway {
stroke: #58a9ed;
}
.legacy-carto path.line.casing.tag-highway-motorway,
.legacy-carto path.line.casing.tag-highway-motorway_link,
.legacy-carto path.line.casing.tag-motorway {
stroke: #2c5476;
}
.legacy-carto .preset-icon .icon.tag-highway-trunk,
.legacy-carto .preset-icon .icon.tag-highway-trunk_link {
color: #8cd05f;
fill: #46682f;
}
.legacy-carto path.line.stroke.tag-highway-trunk,
.legacy-carto path.line.stroke.tag-highway-trunk_link,
.legacy-carto path.line.stroke.tag-trunk {
stroke: #8cd05f;
}
.legacy-carto path.line.casing.tag-highway-trunk,
.legacy-carto path.line.casing.tag-highway-trunk_link,
.legacy-carto path.line.casing.tag-trunk {
stroke: #46682f;
}
.legacy-carto .preset-icon .icon.tag-highway-primary,
.legacy-carto .preset-icon .icon.tag-highway-primary_link {
color: #e06d5f;
fill: #70372f;
}
.legacy-carto path.line.stroke.tag-highway-primary,
.legacy-carto path.line.stroke.tag-highway-primary_link,
.legacy-carto path.line.stroke.tag-primary {
stroke: #e06d5f;
}
.legacy-carto path.line.casing.tag-highway-primary,
.legacy-carto path.line.casing.tag-highway-primary_link,
.legacy-carto path.line.casing.tag-primary {
stroke: #70372f;
}
.legacy-carto .preset-icon .icon.tag-highway-secondary,
.legacy-carto .preset-icon .icon.tag-highway-secondary_link {
color: #eab056;
fill: #75582b;
}
.legacy-carto path.line.stroke.tag-highway-secondary,
.legacy-carto path.line.stroke.tag-highway-secondary_link,
.legacy-carto path.line.stroke.tag-secondary {
stroke: #eab056;
}
.legacy-carto path.line.casing.tag-highway-secondary,
.legacy-carto path.line.casing.tag-highway-secondary_link,
.legacy-carto path.line.casing.tag-secondary {
stroke: #75582b;
}
.legacy-carto .preset-icon .icon.tag-highway-tertiary,
.legacy-carto .preset-icon .icon.tag-highway-tertiary_link {
color: #ffff7e;
fill: #7f7f3f;
}
.legacy-carto path.line.stroke.tag-highway-tertiary,
.legacy-carto path.line.stroke.tag-highway-tertiary_link,
.legacy-carto path.line.stroke.tag-tertiary {
stroke: #ffff7e;
}
.legacy-carto path.line.casing.tag-highway-tertiary,
.legacy-carto path.line.casing.tag-highway-tertiary_link,
.legacy-carto path.line.casing.tag-tertiary {
stroke: #7f7f3f;
}
.preset-icon .icon.tag-highway-residential {
color: #fff;
fill: #444;
}
path.line.stroke.tag-highway-residential,
path.line.stroke.tag-residential {
stroke: #fff;
}
path.line.casing.tag-highway-residential,
path.line.casing.tag-residential {
stroke: #444;
}
.preset-icon .icon.tag-highway-unclassified {
color: #dca;
fill: #444;
}
path.line.stroke.tag-highway-unclassified,
path.line.stroke.tag-unclassified {
stroke: #dca;
}
path.line.casing.tag-highway-unclassified,
path.line.casing.tag-unclassified {
stroke: #444;
}
/* narrow highways */
path.line.shadow.tag-highway-living_street,
path.line.shadow.tag-highway-bus_guideway,
path.line.shadow.tag-highway-service,
path.line.shadow.tag-highway-track,
path.line.shadow.tag-highway-road {
stroke-width: 16;
}
path.line.casing.tag-highway-living_street,
path.line.casing.tag-highway-bus_guideway,
path.line.casing.tag-highway-service,
path.line.casing.tag-highway-track,
path.line.casing.tag-highway-road {
stroke-width: 7;
}
path.line.stroke.tag-highway-living_street,
path.line.stroke.tag-highway-bus_guideway,
path.line.stroke.tag-highway-service,
path.line.stroke.tag-highway-track,
path.line.stroke.tag-highway-road {
stroke-width: 5;
}
path.line.shadow.tag-highway-path,
path.line.shadow.tag-highway-footway,
path.line.shadow.tag-highway-cycleway,
path.line.shadow.tag-highway-bridleway,
path.line.shadow.tag-highway-corridor,
path.line.shadow.tag-highway-pedestrian,
path.line.shadow.tag-highway-steps {
stroke-width: 16;
}
path.line.casing.tag-highway-path,
path.line.casing.tag-highway-footway,
path.line.casing.tag-highway-cycleway,
path.line.casing.tag-highway-bridleway,
path.line.casing.tag-highway-corridor,
path.line.casing.tag-highway-pedestrian,
path.line.casing.tag-highway-steps {
stroke-width: 5;
}
path.line.stroke.tag-highway-path,
path.line.stroke.tag-highway-footway,
path.line.stroke.tag-highway-cycleway,
path.line.stroke.tag-highway-bridleway,
path.line.stroke.tag-highway-corridor,
path.line.stroke.tag-highway-pedestrian,
path.line.stroke.tag-highway-steps {
stroke-width: 3;
}
.low-zoom path.line.shadow.tag-highway-living_street,
.low-zoom path.line.shadow.tag-highway-bus_guideway,
.low-zoom path.line.shadow.tag-highway-service,
.low-zoom path.line.shadow.tag-highway-track,
.low-zoom path.line.shadow.tag-highway-road {
stroke-width: 12;
}
.low-zoom path.line.casing.tag-highway-living_street,
.low-zoom path.line.casing.tag-highway-bus_guideway,
.low-zoom path.line.casing.tag-highway-service,
.low-zoom path.line.casing.tag-highway-track,
.low-zoom path.line.casing.tag-highway-road {
stroke-width: 5;
}
.low-zoom path.line.stroke.tag-highway-living_street,
.low-zoom path.line.stroke.tag-highway-bus_guideway,
.low-zoom path.line.stroke.tag-highway-service,
.low-zoom path.line.stroke.tag-highway-track,
.low-zoom path.line.stroke.tag-highway-road {
stroke-width: 3;
}
.low-zoom path.line.shadow.tag-highway-path,
.low-zoom path.line.shadow.tag-highway-footway,
.low-zoom path.line.shadow.tag-highway-cycleway,
.low-zoom path.line.shadow.tag-highway-bridleway,
.low-zoom path.line.shadow.tag-highway-corridor,
.low-zoom path.line.shadow.tag-highway-pedestrian,
.low-zoom path.line.shadow.tag-highway-steps {
stroke-width: 12;
}
.low-zoom path.line.casing.tag-highway-path,
.low-zoom path.line.casing.tag-highway-footway,
.low-zoom path.line.casing.tag-highway-cycleway,
.low-zoom path.line.casing.tag-highway-bridleway,
.low-zoom path.line.casing.tag-highway-corridor,
.low-zoom path.line.casing.tag-highway-pedestrian,
.low-zoom path.line.casing.tag-highway-steps {
stroke-width: 3;
}
.low-zoom path.line.stroke.tag-highway-path,
.low-zoom path.line.stroke.tag-highway-footway,
.low-zoom path.line.stroke.tag-highway-cycleway,
.low-zoom path.line.stroke.tag-highway-bridleway,
.low-zoom path.line.stroke.tag-highway-corridor,
.low-zoom path.line.stroke.tag-highway-pedestrian,
.low-zoom path.line.stroke.tag-highway-steps {
stroke-width: 1;
}
/* living streets */
.preset-icon .icon.tag-highway-living-street {
color: #bbb;
fill: #ddd;
}
path.line.stroke.tag-highway-living_street,
path.line.stroke.tag-living_street {
stroke: #ccc;
}
path.line.casing.tag-highway-living_street,
path.line.casing.tag-living_street {
stroke: #fff;
}
/* pedestrian streets and corridors */
.preset-icon .icon.tag-highway-corridor,
.preset-icon .icon.tag-highway-pedestrian {
color: #8cd05f;
fill: #fff;
}
path.line.stroke.tag-highway-corridor,
path.line.stroke.tag-highway-pedestrian,
path.line.stroke.tag-corridor,
path.line.stroke.tag-pedestrian {
stroke: #fff;
stroke-dasharray: 2, 8;
}
.low-zoom path.line.stroke.tag-highway-corridor,
.low-zoom path.line.stroke.tag-highway-pedestrian,
.low-zoom path.line.stroke.tag-corridor,
.low-zoom path.line.stroke.tag-pedestrian {
stroke-dasharray: 1, 4;
}
path.line.casing.tag-highway-corridor,
path.line.casing.tag-highway-pedestrian,
path.line.casing.tag-corridor,
path.line.casing.tag-pedestrian {
stroke: #8cd05f;
stroke-linecap: round;
stroke-dasharray: none;
}
/* unknown roads */
.preset-icon .icon.tag-highway-road {
color: #9e9e9e;
fill: #666;
}
path.line.stroke.tag-highway-road,
path.line.stroke.tag-road {
stroke: #9e9e9e;
}
path.line.casing.tag-highway-road,
path.line.casing.tag-road {
stroke: #666;
}
/* service roads */
.preset-icon .icon.tag-highway-service {
color: #fff;
fill: #666;
}
path.line.stroke.tag-highway-service,
path.line.stroke.tag-service {
stroke: #fff;
}
path.line.casing.tag-highway-service,
path.line.casing.tag-service {
stroke: #666;
}
/* special service roads and bus guideways */
/* with `service=* tag` (e.g. parking_aisle, alley, drive-through) */
.preset-icon .icon.tag-highway-bus_guideway,
.preset-icon .icon.tag-highway-service.tag-service {
color: #dca;
fill: #666;
}
path.line.stroke.tag-highway-bus_guideway,
path.line.stroke.tag-highway-service.tag-service,
path.line.stroke.tag-service.tag-service {
stroke: #dca;
}
path.line.casing.tag-highway-bus_guideway,
path.line.casing.tag-highway-service.tag-service,
path.line.casing.tag-service.tag-service {
stroke: #666;
}
/* unmaintained track roads */
path.line.stroke.tag-highway-track,
path.line.stroke.tag-track {
stroke: #c5b59f;
}
path.line.casing.tag-highway-track,
path.line.casing.tag-track {
stroke: #746f6f;
}
/* paths */
path.line.stroke.tag-highway-path,
path.line.stroke.tag-highway-footway,
path.line.stroke.tag-highway-cycleway,
path.line.stroke.tag-highway-bridleway {
stroke-linecap: butt;
stroke-dasharray: 6, 6;
}
.low-zoom path.line.stroke.tag-highway-path,
.low-zoom path.line.stroke.tag-highway-footway,
.low-zoom path.line.stroke.tag-highway-cycleway,
.low-zoom path.line.stroke.tag-highway-bridleway {
stroke-linecap: butt;
stroke-dasharray: 3, 3;
}
/* style for features that should have highway=footway but don't yet */
path.line.stroke.tag-crossing,
path.line.stroke.tag-footway-access_aisle,
path.line.stroke.tag-public_transport-platform,
path.line.stroke.tag-highway-platform,
path.line.stroke.tag-railway-platform,
path.line.stroke.tag-man_made-pier {
stroke: #dca;
}
path.line.casing.tag-highway-path,
path.line.casing.tag-highway-footway.tag-public_transport-platform,
path.line.casing.tag-highway-footway.tag-man_made-pier,
path.line.casing.tag-highway.tag-crossing,
path.line.casing.tag-highway.tag-footway-access_aisle {
stroke: #dca;
stroke-linecap: round;
stroke-dasharray: none;
}
path.line.casing.tag-highway-footway,
path.line.casing.tag-highway-cycleway,
path.line.casing.tag-highway-bridleway {
stroke: #fff;
stroke-linecap: round;
stroke-dasharray: none;
}
.preset-icon .icon.tag-highway-path,
.preset-icon .icon.tag-highway-footway.tag-public_transport-platform,
.preset-icon .icon.tag-highway-footway.tag-man_made-pier {
color: #988;
fill: #dca;
}
path.line.stroke.tag-highway-path {
stroke: #988;
}
/* footways */
.preset-icon .icon.tag-route-foot,
.preset-icon .icon.tag-route-hiking,
.preset-icon .icon.tag-highway-footway {
color: #988;
fill: #fff;
}
path.line.stroke.tag-highway-footway,
path.line.stroke.tag-highway_bus_stop,
.preset-icon-container path.casing.tag-highway-footway {
stroke: #988;
}
.preset-icon .icon.tag-highway-footway.tag-footway-sidewalk {
color: #d4b4b4;
}
path.stroke.tag-highway-footway.tag-footway-sidewalk,
.preset-icon-container path.casing.tag-highway-footway.tag-footway-sidewalk {
stroke: #d4b4b4;
}
.preset-icon-container path.stroke.tag-highway-footway:not(.tag-crossing-marked):not(.tag-crossing-unmarked):not(.tag-footway-access_aisle):not(.tag-man_made-pier):not(.tag-public_transport-platform) {
stroke: #fff;
}
/* cycleways */
.preset-icon .icon.tag-route-bicycle,
.preset-icon .icon.tag-highway-cycleway {
color: #58a9ed;
fill: #fff;
}
path.line.stroke.tag-highway-cycleway,
.preset-icon-container path.casing.tag-highway-cycleway {
stroke: #58a9ed;
}
.preset-icon-container path.stroke.tag-highway-cycleway:not(.tag-crossing) {
stroke: #fff;
}
/* bridleways */
.preset-icon .icon.tag-route-horse,
.preset-icon .icon.tag-highway-bridleway {
color: #e06d5f;
fill: #fff;
}
path.line.stroke.tag-highway-bridleway,
.preset-icon-container path.casing.tag-highway-bridleway {
stroke: #e06d5f;
}
.preset-icon-container path.stroke.tag-highway-bridleway {
stroke: #fff;
}
/* racetracks */
.preset-icon .icon.tag-leisure-track {
color: rgb(229, 184, 43);
}
path.line.stroke.tag-leisure-track,
.preset-icon-container path.casing.tag-highway.tag-leisure-track {
stroke: rgb(229, 184, 43);
}
.preset-icon-container path.line.stroke.tag-highway.tag-leisure-track {
stroke: #fff;
}
/* steps */
.preset-icon .icon.tag-highway-steps {
color: #81d25c;
fill: #fff;
}
path.line.stroke.tag-highway-steps {
stroke-linecap: butt;
stroke-dasharray: 3, 3;
}
.low-zoom path.line.stroke.tag-highway-steps {
stroke-dasharray: 2, 2;
}
path.line.casing.tag-highway-steps {
stroke: #fff;
stroke-linecap: round;
stroke-dasharray: none;
}
path.line.stroke.tag-highway-steps,
.preset-icon-container path.line.casing.tag-highway-steps {
stroke: #81d25c;
}
.preset-icon-container path.line.stroke.tag-highway-steps {
stroke: #fff;
}
/* crossings */
path.line.stroke.tag-highway.tag-crossing-unmarked {
stroke-dasharray: 6, 4;
}
.low-zoom path.line.stroke.tag-highway.tag-crossing-unmarked {
stroke-dasharray: 3, 2;
}
path.line.stroke.tag-highway.tag-crossing-marked {
stroke-dasharray: 6, 3;
}
.low-zoom path.line.stroke.tag-highway.tag-crossing-marked {
stroke-dasharray: 3, 1.5;
}
path.line.stroke.tag-highway-footway.tag-crossing-marked {
stroke: #4c4444;
}
.preset-icon .icon.tag-highway-footway.tag-crossing-marked {
color: #4c4444;
}
path.line.stroke.tag-highway-footway.tag-crossing-unmarked {
stroke: #776a6a;
}
.preset-icon .icon.tag-highway-footway.tag-crossing-unmarked {
color: #776a6a;
}
path.line.stroke.tag-highway-cycleway.tag-crossing-marked {
stroke: #446077;
}
.preset-icon .icon.tag-highway-cycleway.tag-crossing-marked {
color: #446077;
}
path.line.stroke.tag-highway.tag-footway-access_aisle {
stroke-dasharray: 4, 2;
}
.low-zoom path.line.stroke.tag-highway.tag-footway-access_aisle,
.preset-icon-container path.stroke.tag-highway.tag-footway-access_aisle {
stroke-dasharray: 2.5, 1.5;
}
path.line.stroke.tag-highway.tag-footway-access_aisle {
stroke: #4c4444;
}
.preset-icon .icon.tag-highway.tag-footway-access_aisle {
color: #4c4444;
}
/* highway midpoints */
g.midpoint.tag-highway-corridor .fill,
g.midpoint.tag-highway-pedestrian .fill,
g.midpoint.tag-highway-steps .fill,
g.midpoint.tag-highway-path .fill,
g.midpoint.tag-highway-footway .fill,
g.midpoint.tag-highway-cycleway .fill,
g.midpoint.tag-highway-bridleway .fill {
fill: #fff;
stroke: #333;
stroke-opacity: .8;
opacity: .8;
}
+83
View File
@@ -0,0 +1,83 @@
/* aeroways */
/* areas */
path.area.stroke.tag-aeroway,
.low-zoom path.area.stroke.tag-aeroway {
stroke: #fff;
stroke-dasharray: none;
stroke-width: 1;
}
path.area.fill.tag-aeroway-runway {
stroke: rgba(0, 0, 0, 0.6);
fill: rgba(0, 0, 0, 0.6);
}
/* lines */
/* narrow aeroways (taxiway) */
path.line.shadow.tag-aeroway-taxiway,
path.line.shadow.tag-taxiway {
stroke-width: 16;
}
path.line.casing.tag-aeroway-taxiway,
path.line.casing.tag-taxiway {
stroke-width: 7;
}
path.line.stroke.tag-aeroway-taxiway,
path.line.stroke.tag-taxiway {
stroke-width: 5;
}
.low-zoom path.line.shadow.tag-aeroway-taxiway,
.low-zoom path.line.shadow.tag-taxiway {
stroke-width: 12;
}
.low-zoom path.line.casing.tag-aeroway-taxiway,
.low-zoom path.line.casing.tag-taxiway {
stroke-width: 5;
}
.low-zoom path.line.stroke.tag-aeroway-taxiway,
.low-zoom path.line.stroke.tag-taxiway {
stroke-width: 3;
}
path.line.stroke.tag-aeroway-taxiway,
path.line.stroke.tag-taxiway {
stroke: #ff0;
}
path.line.casing.tag-aeroway-taxiway,
path.line.casing.tag-taxiway {
stroke: #666;
}
/* wide aeroways (runway) */
.preset-icon .icon.tag-aeroway-runway,
.preset-icon .icon.tag-runway {
color: #444;
fill: #000;
}
path.line.shadow.tag-aeroway-runway {
stroke-width: 20;
}
path.line.casing.tag-aeroway-runway {
stroke-width: 10;
stroke: #000;
stroke-linecap: square;
}
path.line.stroke.tag-aeroway-runway {
stroke: #fff;
stroke-width: 2;
stroke-linecap: butt;
stroke-dasharray: 24, 48;
}
.low-zoom path.line.shadow.tag-aeroway-runway {
stroke-width: 16;
}
.low-zoom path.line.casing.tag-aeroway-runway {
stroke-width: 7;
}
.low-zoom path.line.stroke.tag-aeroway-runway {
stroke-width: 2;
stroke-dasharray: 12, 24;
}
.preset-icon-container path.line.stroke.tag-aeroway-runway {
stroke-dasharray: 0, 14, 8, 14;
}
+78
View File
@@ -0,0 +1,78 @@
/* railways */
/* defaults */
.preset-icon .icon.tag-railway.other-line {
color: #fff;
fill: #777;
}
.preset-icon .icon.tag-railway {
color: #555;
}
/* lines */
/* narrow widths */
path.line.shadow.tag-railway {
stroke-width: 16;
}
path.line.casing.tag-railway {
stroke-width: 7;
}
path.line.stroke.tag-railway {
stroke-width: 2;
stroke-linecap: butt;
stroke-dasharray: 12,12;
}
.low-zoom path.line.shadow.tag-railway {
stroke-width: 12;
}
.low-zoom path.line.casing.tag-railway {
stroke-width: 5;
}
.low-zoom path.line.stroke.tag-railway {
stroke-width: 2;
stroke-dasharray: 6,6;
}
.preset-icon-container path.line.stroke.tag-railway:not(.tag-status),
.preset-icon-container path.line.stroke.tag-railway.tag-status-disused {
stroke-dasharray: 6;
}
path.line.casing.tag-railway.tag-railway-platform {
stroke-width: 0;
}
path.line.stroke.tag-railway.tag-railway-platform {
stroke-dasharray: none;
}
/* styles */
path.line.casing.tag-railway {
stroke: #555;
}
path.line.stroke.tag-railway {
stroke: #eee;
}
.preset-icon .icon.tag-railway.tag-status {
color: #999;
}
path.line.casing.tag-railway.tag-status {
stroke: #999;
}
path.line.stroke.tag-railway.tag-status:not(.tag-service) {
stroke: #eee;
}
.preset-icon .icon.tag-railway.tag-status-disused {
color: #808080;
}
path.line.casing.tag-railway.tag-status-disused {
stroke: #808080;
}
path.line.casing.tag-railway-subway {
stroke: #222;
}
path.line.stroke.tag-railway-subway {
stroke: #bbb;
}
+97
View File
@@ -0,0 +1,97 @@
/* waterways */
/* defaults */
.preset-icon .icon.tag-waterway.other-line {
color: #7dd;
fill: #7dd;
}
.preset-icon .icon.tag-type-waterway:not(.tag-waterway-dam),
.preset-icon .icon.tag-waterway:not(.tag-waterway-dam) {
color: #7dd;
fill: #fff;
}
/* areas */
path.area.stroke.tag-waterway-dock,
path.area.stroke.tag-waterway-boatyard,
path.area.stroke.tag-waterway-fuel {
stroke: white;
stroke-width: 1;
}
path.area.casing.tag-waterway-dock,
path.area.casing.tag-waterway-boatyard,
path.area.casing.tag-waterway-fuel {
stroke: none;
}
path.area.fill.tag-waterway-dock,
path.area.fill.tag-waterway-boatyard,
path.area.fill.tag-waterway-fuel {
stroke: rgba(255, 255, 255, 0.3);
fill: rgba(255, 255, 255, 0.3);
}
/* lines */
path.line.fill.tag-waterway:not(.tag-waterway-dam) {
stroke: rgba(119, 211, 222, 0.3);
fill: rgba(119, 211, 222, 0.3);
}
path.line.casing.tag-waterway:not(.tag-waterway-dam) {
stroke: #444;
}
path.line.stroke.tag-waterway:not(.tag-waterway-dam) {
stroke: #7dd;
}
/* narrow waterways (default) */
path.line.shadow.tag-waterway {
stroke-width: 16;
}
path.line.casing.tag-waterway {
stroke-width: 7;
}
path.line.stroke.tag-waterway {
stroke-width: 5;
}
.low-zoom path.line.shadow.tag-waterway {
stroke-width: 12;
}
.low-zoom path.line.casing.tag-waterway {
stroke-width: 5;
}
.low-zoom path.line.stroke.tag-waterway {
stroke-width: 3;
}
/* wide waterways (river) */
path.line.shadow.tag-waterway-river {
stroke-width: 20;
}
path.line.casing.tag-waterway-river {
stroke-width: 10;
}
path.line.stroke.tag-waterway-river {
stroke-width: 8;
}
.low-zoom path.line.shadow.tag-waterway-river {
stroke-width: 16;
}
.low-zoom path.line.casing.tag-waterway-river {
stroke-width: 7;
}
.low-zoom path.line.stroke.tag-waterway-river {
stroke-width: 5;
}
/* ditch */
.preset-icon .icon.tag-waterway-ditch {
color: #39a;
}
path.line.stroke.tag-waterway-ditch {
stroke: #39a;
}
+436
View File
@@ -0,0 +1,436 @@
/* narrow width miscellanous things */
path.line.shadow.tag-aerialway,
path.line.shadow.tag-attraction-summer_toboggan,
path.line.shadow.tag-attraction-water_slide,
path.line.shadow.tag-golf-cartpath,
path.line.shadow.tag-man_made-pipeline,
path.line.shadow.tag-natural-tree_row,
path.line.shadow.tag-piste {
stroke-width: 16;
}
path.line.casing.tag-aerialway,
path.line.casing.tag-attraction-summer_toboggan,
path.line.casing.tag-attraction-water_slide,
path.line.casing.tag-golf-cartpath,
path.line.casing.tag-man_made-pipeline,
path.line.casing.tag-natural-tree_row,
path.line.casing.tag-piste {
stroke-width: 7;
}
path.line.stroke.tag-aerialway,
path.line.stroke.tag-attraction-summer_toboggan,
path.line.stroke.tag-attraction-water_slide,
path.line.stroke.tag-golf-cartpath,
path.line.stroke.tag-man_made-pipeline,
path.line.stroke.tag-natural-tree_row,
path.line.stroke.tag-piste {
stroke-width: 5;
}
.low-zoom path.line.shadow.tag-aerialway,
.low-zoom path.line.shadow.tag-attraction-summer_toboggan,
.low-zoom path.line.shadow.tag-attraction-water_slide,
.low-zoom path.line.shadow.tag-golf-cartpath,
.low-zoom path.line.shadow.tag-man_made-pipeline,
.low-zoom path.line.shadow.tag-natural-tree_row,
.low-zoom path.line.shadow.tag-piste {
stroke-width: 12;
}
.low-zoom path.line.casing.tag-aerialway,
.low-zoom path.line.casing.tag-attraction-summer_toboggan,
.low-zoom path.line.casing.tag-attraction-water_slide,
.low-zoom path.line.casing.tag-golf-cartpath,
.low-zoom path.line.casing.tag-man_made-pipeline,
.low-zoom path.line.casing.tag-natural-tree_row,
.low-zoom path.line.casing.tag-piste {
stroke-width: 5;
}
.low-zoom path.line.stroke.tag-aerialway,
.low-zoom path.line.stroke.tag-attraction-summer_toboggan,
.low-zoom path.line.stroke.tag-attraction-water_slide,
.low-zoom path.line.stroke.tag-golf-cartpath,
.low-zoom path.line.stroke.tag-man_made-pipeline,
.low-zoom path.line.stroke.tag-natural-tree_row,
.low-zoom path.line.stroke.tag-piste {
stroke-width: 3;
}
/* ferry routes */
.preset-icon .icon.tag-route-ferry {
color: #58a9ed;
fill: #fff;
}
path.line.shadow.tag-route-ferry {
stroke-width: 16;
}
path.line.stroke.tag-route-ferry {
stroke-width: 3;
stroke-linecap: butt;
stroke-dasharray: 12,8;
}
.low-zoom path.line.shadow.tag-route-ferry {
stroke-width: 12;
}
.low-zoom path.line.stroke.tag-route-ferry,
.preset-icon-container path.line.stroke.tag-route-ferry {
stroke-width: 2;
stroke-dasharray: 6,4;
}
path.line.stroke.tag-route-ferry {
stroke: #58a9ed;
}
path.line.casing.tag-route-ferry {
stroke: none;
}
/* aerialways */
path.line.stroke.tag-aerialway {
stroke: #c55;
}
path.line.casing.tag-aerialway {
stroke: #444;
}
/* pistes */
path.line.stroke.tag-piste {
stroke: #a9d;
}
path.line.casing.tag-piste {
stroke: #444;
}
/* Attractions */
path.line.stroke.tag-attraction-summer_toboggan {
stroke: #9e9e9e;
}
path.line.casing.tag-attraction-summer_toboggan {
stroke: #666;
}
path.line.stroke.tag-attraction-water_slide {
stroke: #aae0cb;
}
path.line.casing.tag-attraction-water_slide {
stroke: #3d6c71;
}
/* golf cartpaths (like service roads) */
.preset-icon .icon.tag-golf-cartpath {
color: #dca;
fill: #666;
}
path.line.stroke.tag-golf-cartpath {
stroke: #dca;
}
path.line.casing.tag-golf-cartpath {
stroke: #666;
}
/* power and pipeline */
.preset-icon .icon.tag-man_made-pipeline,
.preset-icon .icon.tag-power {
color: #939393;
fill: #939393;
}
/* power */
path.line.stroke.tag-power {
stroke: #939393;
stroke-width: 2;
}
path.line.casing.tag-power {
stroke: none;
}
/* pipeline */
path.line.stroke.tag-man_made-pipeline {
stroke: #cbd0d8;
stroke-linecap: butt;
stroke-dasharray: 80, 1.25;
}
path.line.casing.tag-man_made-pipeline {
stroke: #666;
}
.low-zoom path.line.stroke.tag-man_made-pipeline {
stroke-dasharray: 40, 1;
}
.preset-icon-container path.line.stroke.tag-man_made-pipeline {
stroke-dasharray: 19, 1;
}
/* boundaries */
path.line.stroke.tag-boundary {
stroke: #fff;
stroke-width: 2;
stroke-linecap: butt;
stroke-dasharray: 20, 5, 5, 5;
}
path.line.casing.tag-boundary {
stroke: #82b5fe;
stroke-width: 6;
}
path.line.casing.tag-boundary-protected_area,
path.line.casing.tag-boundary-national_park {
stroke: #b0e298;
}
/* barriers and similar */
path.line.stroke.tag-barrier:not(.tag-barrier-hedge):not(.tag-waterway) {
stroke: #ddd;
}
.preset-icon-container path.line.stroke.tag-barrier:not(.tag-barrier-hedge) {
stroke: rgb(170, 170, 170);
}
path.line.casing.tag-natural,
path.line.casing.tag-barrier:not(.tag-waterway),
path.line.casing.tag-man_made-groyne,
path.line.casing.tag-man_made-breakwater {
stroke: none;
}
path.line.stroke.tag-barrier:not(.tag-waterway),
path.line.stroke.tag-man_made-groyne,
path.line.stroke.tag-man_made-breakwater {
stroke-width: 3px;
stroke-linecap: round;
stroke-dasharray: 15, 5, 1, 5;
}
.low-zoom path.line.stroke.tag-barrier:not(.tag-waterway),
.low-zoom path.line.stroke.tag-man_made-groyne,
.low-zoom path.line.stroke.tag-man_made-breakwater {
stroke-width: 2px;
stroke-linecap: butt;
stroke-dasharray: 8, 2, 2, 2;
}
.preset-icon-container path.line.stroke.tag-barrier,
.preset-icon-container path.line.stroke.tag-man_made-groyne,
.preset-icon-container path.line.stroke.tag-man_made-breakwater {
stroke-dasharray: 1, 4, 6, 4;
}
path.line.stroke.tag-barrier.tag-barrier-wall,
path.line.stroke.tag-barrier.tag-barrier-retaining_wall,
path.line.stroke.tag-barrier.tag-barrier-city_wall {
stroke-linecap: butt;
stroke-dasharray: 16, 3, 9, 3;
}
.low-zoom path.line.stroke.tag-barrier.tag-barrier-wall,
.low-zoom path.line.stroke.tag-barrier.tag-barrier-retaining_wall,
.low-zoom path.line.stroke.tag-barrier.tag-barrier-city_wall,
.preset-icon-container path.line.stroke.tag-barrier.tag-barrier-wall,
.preset-icon-container path.line.stroke.tag-barrier.tag-barrier-retaining_wall,
.preset-icon-container path.line.stroke.tag-barrier.tag-barrier-city_wall {
stroke-dasharray: 8, 1, 4, 1;
}
/* bridges */
path.line.casing.tag-bridge {
stroke-opacity: 0.6;
stroke: #000 !important;
stroke-linecap: butt;
stroke-dasharray: none;
}
path.line.shadow.tag-bridge {
stroke-width: 24;
}
path.line.casing.tag-bridge {
stroke-width: 16;
}
.low-zoom path.line.shadow.tag-bridge {
stroke-width: 16;
}
.low-zoom path.line.casing.tag-bridge {
stroke-width: 10;
}
path.line.shadow.tag-railway.tag-bridge,
path.line.shadow.tag-highway-living_street.tag-bridge,
path.line.shadow.tag-highway-path.tag-bridge,
path.line.shadow.tag-highway-corridor.tag-bridge,
path.line.shadow.tag-highway-pedestrian.tag-bridge,
path.line.shadow.tag-highway-service.tag-bridge,
path.line.shadow.tag-highway-track.tag-bridge,
path.line.shadow.tag-highway-steps.tag-bridge,
path.line.shadow.tag-highway-footway.tag-bridge,
path.line.shadow.tag-highway-cycleway.tag-bridge,
path.line.shadow.tag-highway-bridleway.tag-bridge {
stroke-width: 18;
}
path.line.casing.tag-railway.tag-bridge,
path.line.casing.tag-highway-living_street.tag-bridge,
path.line.casing.tag-highway-path.tag-bridge,
path.line.casing.tag-highway-corridor.tag-bridge,
path.line.casing.tag-highway-pedestrian.tag-bridge,
path.line.casing.tag-highway-service.tag-bridge,
path.line.casing.tag-highway-track.tag-bridge,
path.line.casing.tag-highway-steps.tag-bridge,
path.line.casing.tag-highway-footway.tag-bridge,
path.line.casing.tag-highway-cycleway.tag-bridge,
path.line.casing.tag-highway-bridleway.tag-bridge {
stroke-width: 10;
}
.low-zoom path.line.shadow.tag-railway.tag-bridge,
.low-zoom path.line.shadow.tag-highway-living_street.tag-bridge,
.low-zoom path.line.shadow.tag-highway-path.tag-bridge,
.low-zoom path.line.shadow.tag-highway-corridor.tag-bridge,
.low-zoom path.line.shadow.tag-highway-pedestrian.tag-bridge,
.low-zoom path.line.shadow.tag-highway-service.tag-bridge,
.low-zoom path.line.shadow.tag-highway-track.tag-bridge,
.low-zoom path.line.shadow.tag-highway-steps.tag-bridge,
.low-zoom path.line.shadow.tag-highway-footway.tag-bridge,
.low-zoom path.line.shadow.tag-highway-cycleway.tag-bridge,
.low-zoom path.line.shadow.tag-highway-bridleway.tag-bridge {
stroke-width: 14;
}
.low-zoom path.line.casing.tag-railway.tag-bridge,
.low-zoom path.line.casing.tag-highway-living_street.tag-bridge,
.low-zoom path.line.casing.tag-highway-path.tag-bridge,
.low-zoom path.line.casing.tag-highway-corridor.tag-bridge,
.low-zoom path.line.casing.tag-highway-pedestrian.tag-bridge,
.low-zoom path.line.casing.tag-highway-service.tag-bridge,
.low-zoom path.line.casing.tag-highway-track.tag-bridge,
.low-zoom path.line.casing.tag-highway-steps.tag-bridge,
.low-zoom path.line.casing.tag-highway-footway.tag-bridge,
.low-zoom path.line.casing.tag-highway-cycleway.tag-bridge,
.low-zoom path.line.casing.tag-highway-bridleway.tag-bridge {
stroke-width: 6;
}
/* tunnels */
path.line.stroke.tag-tunnel,
path.line.stroke.tag-location-underground,
path.line.stroke.tag-location-underwater {
stroke-opacity: 0.3;
}
path.line.casing.tag-tunnel,
path.line.casing.tag-location-underground,
path.line.stroke.tag-location-underwater {
stroke-opacity: 0.5;
stroke-linecap: butt;
stroke-dasharray: none;
}
/* embankments / cuttings */
path.line.shadow.tag-embankment,
path.line.shadow.tag-cutting {
stroke-width: 28;
}
path.line.casing.tag-embankment,
path.line.casing.tag-cutting {
stroke-opacity: 0.5;
stroke: #000;
stroke-width: 22;
stroke-dasharray: 2, 4;
stroke-linecap: butt;
}
.low-zoom path.line.shadow.tag-embankment,
.low-zoom path.line.shadow.tag-cutting {
stroke-width: 14;
}
.low-zoom path.line.casing.tag-embankment,
.low-zoom path.line.casing.tag-cutting {
stroke-width: 10;
}
/* Surface - unpaved */
path.line.casing.tag-unpaved {
stroke: #ccc;
stroke-linecap: butt;
stroke-dasharray: 4, 4;
}
.low-zoom path.line.casing.tag-unpaved {
stroke-dasharray: 3, 3;
}
path.line.casing.tag-bridge.tag-unpaved {
stroke: #000;
}
/* Surface - semipaved */
path.line.casing.tag-semipaved {
stroke-linecap: butt;
stroke-dasharray: 6, 2;
}
.low-zoom path.line.casing.tag-semipaved {
stroke-dasharray: 5, 2;
}
path.line.casing.tag-bridge.tag-semipaved {
stroke: #000;
}
/* Status (e.g. proposed, abandoned) */
path.area.stroke.tag-status:not(.tag-status-disused),
path.line.stroke.tag-status:not(.tag-status-disused),
path.area.casing.tag-status:not(.tag-status-disused),
path.line.casing.tag-status:not(.tag-status-disused) {
stroke-linecap: butt;
stroke-dasharray: 7, 3;
}
.low-zoom path.area.stroke.tag-status:not(.tag-status-disused),
.low-zoom path.line.stroke.tag-status:not(.tag-status-disused),
.low-zoom path.area.casing.tag-status:not(.tag-status-disused),
.low-zoom path.line.casing.tag-status:not(.tag-status-disused) {
stroke-dasharray: 5, 2;
}
/* Road Closed Status */
.preset-icon .icon.tag-highway.tag-status-construction {
color: #fc6c14;
fill: #fff;
}
path.line.shadow.tag-highway.tag-status.tag-status-construction {
stroke-width: 20;
}
path.line.casing.tag-highway.tag-status.tag-status-construction {
stroke-width: 10;
stroke-linecap: butt;
stroke-dasharray: none
}
path.line.stroke.tag-highway.tag-status.tag-status-construction {
stroke-width: 8;
stroke-linecap: butt;
stroke-dasharray: 10, 10;
}
path.line.casing.tag-highway.tag-status.tag-status-construction,
.preset-icon-container path.line.stroke.tag-highway.tag-status.tag-status-construction {
stroke: #fff;
}
path.line.stroke.tag-highway.tag-status.tag-status-construction,
.preset-icon-container path.line.casing.tag-highway.tag-status.tag-status-construction {
stroke: #fc6c14;
}
.low-zoom path.line.shadow.tag-highway.tag-status.tag-status-construction {
stroke-width: 16;
}
.low-zoom path.line.casing.tag-highway.tag-status.tag-status-construction {
stroke-width: 7;
}
.low-zoom path.line.stroke.tag-highway.tag-status.tag-status-construction {
stroke-width: 5;
stroke-dasharray: 8, 8;
}
/* Buildings */
path.stroke.tag-building {
stroke: rgb(224, 110, 95);
}
path.fill.tag-building {
stroke: rgba(224, 110, 95, 0.3);
fill: rgba(224, 110, 95, 0.3);
}
+135
View File
@@ -0,0 +1,135 @@
/* Cursors */
.nope,
.nope * {
cursor: not-allowed !important;
}
.map-in-map,
.main-map {
cursor: auto; /* Opera */
cursor: url(img/cursor-grab.png) 9 9, auto; /* FF */
}
.ideditor.mode-browse .point,
.ideditor.mode-select .point,
.ideditor.mode-select-data .point,
.ideditor.mode-select-error .point,
.ideditor.mode-select-note .point {
cursor: pointer; /* Opera */
cursor: url(img/cursor-select-point.png), pointer; /* FF */
}
.ideditor.mode-browse .vertex,
.ideditor.mode-select .vertex,
.ideditor.mode-select-data .point,
.ideditor.mode-select-error .point,
.ideditor.mode-select-note .point {
cursor: pointer; /* Opera */
cursor: url(img/cursor-select-vertex.png), pointer; /* FF */
}
.ideditor.mode-browse .line,
.ideditor.mode-select .line,
.ideditor.mode-select-data .line,
.ideditor.mode-select-error .line,
.ideditor.mode-select-note .line {
cursor: pointer; /* Opera */
cursor: url(img/cursor-select-line.png), pointer; /* FF */
}
.ideditor.mode-browse .area,
.ideditor.mode-select .area,
.ideditor.mode-select-data .area,
.ideditor.mode-select-error .area,
.ideditor.mode-select-note .area {
cursor: pointer; /* Opera */
cursor: url(img/cursor-select-area.png), pointer; /* FF */
}
.ideditor.mode-browse .midpoint,
.ideditor.mode-select .midpoint,
.ideditor.mode-select-data .midpoint,
.ideditor.mode-select-error .midpoint,
.ideditor.mode-select-note .midpoint {
cursor: pointer; /* Opera */
cursor: url(img/cursor-select-split.png), pointer; /* FF */
}
.ideditor.mode-select .behavior-multiselect .point,
.ideditor.mode-select .behavior-multiselect .vertex,
.ideditor.mode-select .behavior-multiselect .line,
.ideditor.mode-select .behavior-multiselect .area {
cursor: pointer; /* Opera */
cursor: url(img/cursor-select-add.png), pointer; /* FF */
}
.ideditor.mode-select .behavior-multiselect .selected {
cursor: pointer; /* Opera */
cursor: url(img/cursor-select-remove.png), pointer; /* FF */
}
.ideditor.mode-add-preset .main-map,
.ideditor.mode-draw-line .main-map,
.ideditor.mode-draw-area .main-map,
.ideditor.mode-add-line .main-map,
.ideditor.mode-add-area .main-map,
.ideditor.mode-drag-node .main-map,
.ideditor.mode-drag-note .main-map {
cursor: crosshair; /* Opera */
cursor: url(img/cursor-draw.png) 9 9, crosshair; /* FF */
}
.ideditor.mode-draw-line .way.target,
.ideditor.mode-draw-area .way.target,
.ideditor.mode-add-line .way.target,
.ideditor.mode-add-area .way.target,
.ideditor.mode-drag-node .way.target {
cursor: crosshair; /* Opera */
cursor: url(img/cursor-draw-connect-line.png) 9 9, crosshair; /* FF */
}
.ideditor.mode-draw-line .vertex.target,
.ideditor.mode-draw-area .vertex.target,
.ideditor.mode-add-line .vertex.target,
.ideditor.mode-add-area .vertex.target,
.ideditor.mode-drag-node .vertex.target {
cursor: crosshair; /* Opera */
cursor: url(img/cursor-draw-connect-vertex.png) 9 9, crosshair; /* FF */
}
.ideditor.mode-add-point .main-map,
.ideditor.mode-add-note .main-map,
.ideditor.mode-browse.lasso .main-map,
.ideditor.mode-browse.lasso .way,
.ideditor.mode-browse.lasso .vertex,
.ideditor.mode-browse.lasso .midpoint,
.ideditor.mode-select.lasso .main-map,
.ideditor.mode-select.lasso .way,
.ideditor.mode-select.lasso .vertex,
.ideditor.mode-select.lasso .midpoint {
cursor: crosshair; /* Opera */
cursor: url(img/cursor-draw.png) 9 9, crosshair; /* FF */
}
.ideditor.mode-browse .note,
.ideditor.mode-select .note,
.ideditor.mode-select-data .note,
.ideditor.mode-select-error .note,
.ideditor.mode-select-note .note {
cursor: pointer;
}
.ideditor.mode-browse .qaItem,
.ideditor.mode-select .qaItem,
.ideditor.mode-select-data .qaItem,
.ideditor.mode-select-error .qaItem,
.ideditor.mode-select-note .qaItem {
cursor: pointer;
}
/* turn restriction editor */
.turn rect,
.turn circle {
cursor: pointer;
}
+365
View File
@@ -0,0 +1,365 @@
/* photo viewer div */
.photoviewer {
position: relative;
flex-shrink: 0;
margin-bottom: 10px;
width: 330px;
height: 250px;
padding: 5px;
background-color: #fff;
}
.ideditor[dir='ltr'] .photoviewer {
margin-left: 10px;
margin-right: 2px;
}
.ideditor[dir='rtl'] .photoviewer {
margin-right: 10px;
margin-left: 2px;
}
@media screen and (min-width: 1600px) {
.photoviewer {
width: 490px;
height: 370px;
}
}
.photoviewer button.thumb-hide {
border-radius: 0;
padding: 5px;
position: absolute;
right: 5px;
top: 5px;
z-index: 50;
}
.photoviewer button.resize-handle-xy {
border-radius: 0;
position: absolute;
top: 0;
right: 0;
z-index: 49;
cursor: nesw-resize;
height: 25px;
width: 25px;
}
.photoviewer button.resize-handle-x {
border-radius: 0;
position: absolute;
top: 0;
right: 0;
bottom: 0;
z-index: 48;
cursor: ew-resize;
height: auto;
width: 6px;
}
.photoviewer button.resize-handle-y {
border-radius: 0;
position: absolute;
top: 0;
right: 0;
z-index: 48;
cursor: ns-resize;
height: 6px;
width: 100%;
}
.photo-wrapper,
.photo-wrapper img {
width: 100%;
height: 100%;
overflow: hidden;
object-fit: cover;
}
.photo-wrapper .photo-attribution {
position: absolute;
bottom: 0;
right: 0;
width: 100%;
font-size: 10px;
text-align: right;
line-height: 1.1em;
padding: 4px 2px;
z-index: 10;
}
.photo-attribution a,
.photo-attribution a:visited,
.photo-attribution span {
padding: 4px 2px;
color: #fff;
}
/* markers and sequences */
.viewfield-group {
pointer-events: none;
}
.ideditor.mode-browse .viewfield-group,
.ideditor.mode-select .viewfield-group,
.ideditor.mode-select-data .viewfield-group,
.ideditor.mode-select-error .viewfield-group,
.ideditor.mode-select-note .viewfield-group {
pointer-events: visible;
cursor: pointer;
}
.viewfield-group.currentView * {
fill: #ffee00 !important;
}
.viewfield-group.hovered * {
fill: #eebb00 !important;
}
.viewfield-group circle {
stroke: #555;
stroke-width: 1;
stroke-opacity: 0.4;
fill-opacity: 0.4;
}
.viewfield-group.highlighted circle {
stroke: #222;
stroke-opacity: 0.9;
fill-opacity: 0.9;
}
.viewfield-group.highlighted.hovered circle {
stroke: #222;
stroke-width: 2;
stroke-opacity: 0.9;
fill-opacity: 0.9;
}
.viewfield-group.highlighted.currentView circle {
stroke: #222;
stroke-width: 2;
stroke-opacity: 1;
fill-opacity: 1;
}
.viewfield-group .viewfield {
stroke-width: 0;
stroke: #222;
fill-opacity: 0.4;
}
.viewfield-group.highlighted .viewfield {
stroke-width: 1;
fill-opacity: 0.8;
}
.viewfield-group.highlighted.hovered .viewfield {
stroke-width: 1;
fill-opacity: 0.8;
}
.viewfield-group.highlighted.currentView .viewfield {
stroke-width: 1;
fill-opacity: 0.9;
}
.viewfield-group.currentView .viewfield-scale {
transform: scale(2,2);
}
.sequence {
fill: none;
stroke-width: 2;
stroke-opacity: 0.4;
}
.sequence.highlighted,
.sequence.currentView {
stroke-width: 4;
stroke-opacity: 1;
}
/* Streetside Image Layer */
.layer-streetside-images {
pointer-events: none;
}
.layer-streetside-images .viewfield-group * {
fill: #0fffc4;
}
.layer-streetside-images .sequence {
stroke: #0fffc4;
stroke-opacity: 0.85; /* bump opacity - only one per road */
}
/* Mapillary Image Layer */
.layer-mapillary {
pointer-events: none;
}
.layer-mapillary .viewfield-group * {
fill: #55ff22;
}
.layer-mapillary .sequence {
stroke: #55ff22;
}
/* Mapillary Traffic Signs and Map Features Layers */
.layer-mapillary-detections {
pointer-events: none;
}
.layer-mapillary-detections .icon-detected {
outline: 2px solid transparent;
pointer-events: visible;
cursor: pointer;
opacity: 0.75;
}
.layer-mapillary-detections .icon-detected rect {
fill: none;
}
.layer-mapillary-detections .icon-detected:hover rect {
outline: 3px solid rgba(255, 238, 0, 0.6);
}
.layer-mapillary-detections .icon-detected.currentView rect {
outline: 3px solid rgba(255, 238, 0, 1);
}
.layer-mapillary-detections .icon-detected:hover,
.layer-mapillary-detections .icon-detected.currentView {
opacity: 1;
}
/* OpenStreetCam Image Layer */
.layer-openstreetcam {
pointer-events: none;
}
.layer-openstreetcam .viewfield-group * {
fill: #20c4ff;
}
.layer-openstreetcam .sequence {
stroke: #20c4ff;
}
/* Streetside Viewer (pannellum) */
.ms-wrapper .photo-attribution .image-link {
display: block;
}
.ms-wrapper .photo-attribution .attribution-row {
display: flex;
flex-flow: row nowrap;
justify-content: space-between;
align-items: center;
padding: 0 5px;
}
.ms-wrapper .photo-attribution .image-view-link {
text-align: left;
margin: 0 5px;
}
.ms-wrapper .photo-attribution .image-report-link {
text-align: right;
}
.ms-wrapper .photo-attribution a:active,
.ms-wrapper .photo-attribution a:hover {
color: #0fffc4;
}
.ms-wrapper .pnlm-compass.pnlm-control {
width: 26px;
height: 26px;
left: 4px;
top: 60px;
background-size: contain;
background-repeat: no-repeat no-repeat;
}
label.streetside-hires {
cursor: pointer;
}
.streetside-hires span {
margin-top: 2px;
}
.streetside-hires input[type="checkbox"] {
float: left;
width: 12px;
height: 12px;
margin: 0 5px;
}
/* Mapillary viewer */
#ideditor-mly .domRenderer .TagSymbol {
font-size: 10px;
background-color: rgba(0,0,0,0.4);
padding: 0 4px;
border-radius: 4px;
top: -25px;
}
#ideditor-mly .domRenderer .Attribution {
/* we will roll our own to avoid async update issues like #4526 */
display: none;
}
.mly-wrapper .photo-attribution a:active,
.mly-wrapper .photo-attribution a:hover {
color: #35af6d;
}
.mly-wrapper .mapillary-js-dom {
z-index: 9;
}
/* OpenStreetCam viewer */
.osc-wrapper {
position: relative;
background-color: #000;
background-image: url(img/loader-black.gif);
background-position: center;
background-repeat: no-repeat;
}
.osc-wrapper .photo-attribution a:active,
.osc-wrapper .photo-attribution a:hover {
color: #20c4ff;
}
.osc-image-wrap {
width: 100%;
height: 100%;
transform-origin:0 0;
-ms-transform-origin:0 0;
-webkit-transform-origin:0 0;
-moz-transform-origin:0 0;
-o-transform-origin:0 0;
}
/* photo-controls (step forward, back, rotate) */
.photo-controls-wrap {
text-align: center;
position: absolute;
top: 10px;
width: 100%;
z-index: 10;
}
.photo-controls {
display: inline-block;
z-index: 10;
}
.photo-controls button,
.photo-controls button:focus {
height: 18px;
width: 18px;
background: rgba(0,0,0,0.65);
color: #eee;
border-radius: 0;
}
.photo-controls button:first-of-type {
border-radius: 3px 0 0 3px;
}
.photo-controls button:last-of-type {
border-radius: 0 3px 3px 0;
}
.photo-controls button:hover,
.photo-controls button:active {
background: rgba(0,0,0,0.85);
color: #fff;
}
+212
View File
@@ -0,0 +1,212 @@
/* OSM Notes and QA Layers */
.qa-header-icon .qaItem-fill,
.layer-keepRight .qaItem .qaItem-fill,
.layer-improveOSM .qaItem .qaItem-fill,
.layer-osmose .qaItem .qaItem-fill {
stroke: #333;
stroke-width: 1.3px; /* NOTE: likely a better way to scale the icon stroke */
}
.note-header-icon .note-fill,
.layer-notes .note .note-fill {
color: #f30;
stroke: #333;
stroke-width: 40px;
}
.note-header-icon.new .note-fill,
.layer-notes .note.new .note-fill {
color: #fe0;
stroke: #333;
stroke-width: 40px;
}
.note-header-icon.closed .note-fill,
.layer-notes .note.closed .note-fill {
color: #5d0;
stroke: #333;
stroke-width: 40px;
}
/* slight adjustments to preset icon for note icons */
.note-header-icon .preset-icon-28 {
top: 18px;
}
.note-header-icon .note-icon-annotation {
position: absolute;
top: 22px;
left: 22px;
margin: auto;
}
.note-header-icon .note-icon-annotation .icon {
width: 15px;
height: 15px;
}
/* adjustment to center QA icons */
.qa-header-icon .preset-icon-28 {
top: auto;
left: auto;
}
.qa-header-icon {
display: flex;
align-items: center;
justify-content: center;
}
/* Keep Right Issues
------------------------------------------------------- */
.keepRight.itemType-20, /* multiple nodes on same spot */
.keepRight.itemType-40, /* impossible oneways */
.keepRight.itemType-210, /* self intersecting ways */
.keepRight.itemType-270, /* unusual motorway connection */
.keepRight.itemType-310, /* roundabout issues */
.keepRight.itemType-320, /* improper _link */
.keepRight.itemType-350 { /* improper bridge tag */
color: #ff9;
}
.keepRight.itemType-50 { /* almost junctions */
color: #88f;
}
.keepRight.itemType-60, /* deprecated tags */
.keepRight.itemType-70, /* tagging issues */
.keepRight.itemType-90, /* motorway without ref */
.keepRight.itemType-100, /* place of worship without religion */
.keepRight.itemType-110, /* poi without name */
.keepRight.itemType-150, /* railway crossing without tag */
.keepRight.itemType-220, /* misspelled tag */
.keepRight.itemType-380 { /* non-physical sport tag */
color: #5d0;
}
.keepRight.itemType-130 { /* disconnected ways */
color: #fa3;
}
.keepRight.itemType-170 { /* FIXME tag */
color: #ff0;
}
.keepRight.itemType-190 { /* intersection without junction */
color: #f33;
}
.keepRight.itemType-200 { /* overlapping ways */
color: #fdbf6f;
}
.keepRight.itemType-160, /* railway layer conflict */
.keepRight.itemType-230 { /* layer conflict */
color: #b60;
}
.keepRight.itemType-280 { /* boundary issues */
color: #5f47a0;
}
.keepRight.itemType-180, /* relation without type */
.keepRight.itemType-290 { /* turn restriction issues */
color: #ace;
}
.keepRight.itemType-300, /* missing maxspeed */
.keepRight.itemType-390 { /* missing tracktype */
color: #090;
}
.keepRight.itemType-360, /* language unknown */
.keepRight.itemType-370, /* doubled places */
.keepRight.itemType-410 { /* website issues */
color: #f9b;
}
.keepRight.itemType-120, /* way without nodes */
.keepRight.itemType-400 { /* geometry / turn angles */
color: #c35;
}
/* ImproveOSM Issues
------------------------------------------------------- */
.improveOSM.itemType-ow { /* missing one way */
color: #1E90FF;
}
.improveOSM.itemType-mr-road { /* missing road */
color: #B452CD;
}
.improveOSM.itemType-mr-path { /* missing path */
color: #A0522D;
}
.improveOSM.itemType-mr-parking { /* missing parking */
color: #EEEE00;
}
.improveOSM.itemType-mr-both { /* missing road+parking */
color: #FFA500;
}
.improveOSM.itemType-tr { /* missing turn restriction */
color: #EC1C24;
}
/* Custom Map Data (geojson, gpx, kml, vector tile) */
.layer-mapdata {
pointer-events: none;
}
.layer-mapdata path.shadow {
pointer-events: stroke;
stroke: #f6634f;
stroke-width: 16;
stroke-opacity: 0;
fill: none;
}
.layer-mapdata path.MultiPoint.shadow,
.layer-mapdata path.Point.shadow {
pointer-events: fill;
fill: #f6634f;
fill-opacity: 0;
}
.layer-mapdata path.shadow.hover:not(.selected) {
stroke-opacity: 0.4;
}
.layer-mapdata path.shadow.selected {
stroke-opacity: 0.7;
}
.layer-mapdata path.stroke {
stroke: #ff26d4;
stroke-width: 2;
fill: none;
}
.layer-mapdata path.fill {
stroke-width: 0;
stroke-opacity: 0.3;
stroke: #ff26d4;
fill: #ff26d4;
fill-opacity: 0.3;
fill-rule: evenodd;
}
.layer-mapdata text.label-halo,
.layer-mapdata text.label {
font-size: 10px;
font-weight: bold;
dominant-baseline: middle;
}
.layer-mapdata text.label {
fill: #ff26d4;
}
.layer-mapdata text.label.hover,
.layer-mapdata text.label.selected {
fill: #f6634f;
}
.layer-mapdata text.label-halo {
opacity: 0.7;
stroke: #000;
stroke-width: 5px;
stroke-miterlimit: 1;
}
+55
View File
@@ -0,0 +1,55 @@
/* Fill Styles */
.low-zoom.fill-wireframe path.stroke,
.fill-wireframe path.stroke {
stroke-width: 1 !important;
stroke-opacity: 0.5 !important;
stroke-dasharray: none !important;
fill: none !important;
}
.low-zoom.fill-wireframe .layer-mapdata path.stroke,
.fill-wireframe .layer-mapdata path.stroke {
stroke-width: 2 !important;
stroke-opacity: 1 !important;
}
.low-zoom.fill-wireframe path.shadow,
.fill-wireframe path.shadow {
stroke-width: 12;
}
.fill-wireframe path.shadow.related:not(.selected),
.fill-wireframe path.shadow.hover:not(.selected) {
stroke-opacity: 0.4;
}
.fill-wireframe path.shadow.selected {
stroke-opacity: 0.6;
}
.fill-wireframe .point,
.fill-wireframe .areaicon,
.fill-wireframe .areaicon-halo,
.fill-wireframe path.casing,
.fill-wireframe path.fill,
.fill-wireframe path.oneway {
display: none !important;
}
.fill-partial path.area.fill {
fill-opacity: 0;
stroke-width: 60px;
pointer-events: none;
}
.fill-partial path.area.fill.tag-building_part {
stroke-width: 40px;
}
.fill-partial path.area.fill.tag-indoor {
stroke-width: 20px;
}
.ideditor.mode-browse .fill-partial path.area.fill,
.ideditor.mode-select .fill-partial path.area.fill,
.ideditor.mode-select-data .fill-partial path.area.fill,
.ideditor.mode-select-error .fill-partial path.area.fill,
.ideditor.mode-select-note .fill-partial path.area.fill {
pointer-events: visibleStroke;
}
+5522
View File
File diff suppressed because it is too large Load Diff
-3077
View File
File diff suppressed because it is too large Load Diff
-1
View File
@@ -1 +0,0 @@
../dist/img/
-1646
View File
File diff suppressed because it is too large Load Diff
-37
View File
@@ -1,37 +0,0 @@
[
{
"format": [["housenumber", "street"], ["city", "postcode"]]
},
{
"countryCodes": ["gb"],
"format": [["housename"], ["housenumber", "street"], ["city", "postcode"]]
},
{
"countryCodes": ["ie"],
"format": [["housename"], ["housenumber", "street"], ["city"], ["postcode"]]
},
{
"countryCodes": ["ad", "at", "ba", "be", "ch", "cz", "de", "dk", "es", "fi", "gr", "hr", "is", "it", "li", "nl", "no", "pl", "pt", "se", "si", "sk", "sm", "va"],
"format": [["street", "housenumber"], ["postcode", "city"]]
},
{
"countryCodes": ["fr", "lu", "mo"],
"format": [["housenumber", "street"], ["postcode", "city"]]
},
{
"countryCodes": ["br"],
"format": [["street"], ["housenumber", "suburb"], ["city", "postcode"]]
},
{
"countryCodes": ["vn"],
"format": [["housenumber", "street"], ["subdistrict"], ["district"], ["city"], ["province", "postcode"]]
},
{
"countryCodes": ["us"],
"format": [["housenumber", "street"], ["city", "state", "postcode"]]
},
{
"countryCodes": ["ca"],
"format": [["housenumber", "street"], ["city", "province", "postcode"]]
}
]
+182
View File
@@ -0,0 +1,182 @@
[
{
"format": [
["housenumber", "street"],
["city", "postcode"]
]
},
{
"countryCodes": ["au"],
"format": [
["unit","housenumber", "street"],
["suburb", "state", "postcode"]
]
},
{
"countryCodes": ["gb"],
"format": [
["housename"],
["housenumber", "street"],
["city", "postcode"]
]
},
{
"countryCodes": ["ie"],
"format": [
["housename"],
["housenumber", "street"],
["city"],
["postcode"]
]
},
{
"countryCodes": ["at", "ch", "de", "si", "pl"],
"format": [
["street", "housenumber"],
["postcode", "city"]
]
},
{
"countryCodes": [
"ad", "ba", "be", "cz", "dk", "es", "fi", "gr", "hr", "is",
"it", "li", "nl", "no", "pt", "se", "sk", "sm", "va"
],
"format": [
["street", "housenumber", "unit"],
["postcode", "city"]
]
},
{
"countryCodes": ["fr", "lu", "mo"],
"format": [
["housenumber", "street"],
["postcode", "city"]
]
},
{
"countryCodes": ["br"],
"format": [
["street"],
["housenumber", "suburb"],
["city", "postcode"]
]
},
{
"countryCodes": ["vn"],
"format": [
["housenumber", "street"],
["subdistrict"],
["district"],
["city"],
["province", "postcode"]
]
},
{
"countryCodes": ["ca"],
"format": [
["housenumber", "street", "unit"],
["city", "province", "postcode"]
]
},
{
"countryCodes": ["us"],
"format": [
["housenumber", "street", "unit"],
["city", "state", "postcode"]
]
},
{
"countryCodes": ["tw"],
"format": [
["postcode", "city", "district"],
["place", "street"],
["housenumber", "floor", "unit"]
]
},
{
"countryCodes": ["jp"],
"format": [
["postcode", "province", "county"],
["city", "suburb"],
["quarter", "neighbourhood"],
["block_number", "housenumber"]
],
"dropdowns": [
"postcode", "province", "county", "city", "suburb",
"quarter", "neighbourhood", "block_number"
],
"widths": {
"postcode": 0.3,
"province": 0.35,
"county": 0.35,
"city": 0.65,
"suburb": 0.35,
"quarter": 0.5,
"neighbourhood": 0.5,
"block_number": 0.5,
"housenumber": 0.5
}
},
{
"countryCodes": ["tr"],
"format": [
["neighbourhood"],
["street", "housenumber"],
["postcode", "district", "city"]
]
},
{
"countryCodes": ["ua"],
"format": [
["housenumber", "postcode"],
["street"]
]
},
{
"countryCodes": ["cn"],
"format": [
["postcode", "province"],
["city", "district"],
["street", "housenumber"]
],
"widths": {
"postcode": 0.3,
"province": 0.7,
"city": 0.5,
"district": 0.5,
"street": 0.7,
"housenumber": 0.3
}
},
{
"countryCodes": ["bo"],
"format": [
["street", "housenumber"],
["neighbourhood", "city"]
],
"widths": {
"street": 0.7,
"housenumber": 0.3,
"neighbourhood": 0.5,
"city": 0.5
}
},
{
"countryCodes": ["pe"],
"format": [
["street", "housenumber"],
["neighbourhood"],
["city", "state", "postcode"]
],
"dropdowns": [
"street", "neighbourhood", "city", "state", "postcode"
],
"widths": {
"street": 0.7,
"housenumber": 0.3,
"city": 0.4,
"state": 0.4,
"postcode": 0.2
}
}
]
+1772 -454
View File
File diff suppressed because it is too large Load Diff
-46
View File
@@ -1,46 +0,0 @@
iD.data = {
load: function(path, callback) {
if (!callback) {
callback = path;
path = '';
}
iD.util.asyncMap([
path + 'data/deprecated.json',
path + 'data/discarded.json',
path + 'data/imagery.json',
path + 'data/wikipedia.json',
path + 'data/presets/presets.json',
path + 'data/presets/defaults.json',
path + 'data/presets/categories.json',
path + 'data/presets/fields.json',
path + 'data/imperial.json',
path + 'data/feature-icons.json',
path + 'data/locales.json',
path + 'dist/locales/en.json',
path + 'data/name-suggestions.json',
path + 'data/address-formats.json'
], d3.json, function (err, data) {
iD.data = {
deprecated: data[0],
discarded: data[1],
imagery: data[2],
wikipedia: data[3],
presets: {
presets: data[4],
defaults: data[5],
categories: data[6],
fields: data[7]
},
imperial: data[8],
featureIcons: data[9],
locales: data[10],
en: data[11],
suggestions: data[12],
addressFormats: data[13]
};
callback();
});
}
};
+1388 -86
View File
File diff suppressed because it is too large Load Diff
+52 -44
View File
@@ -1,48 +1,56 @@
[
"created_by",
"odbl",
"odbl:note",
{
"created_by": true,
"tiger:upload_uuid",
"tiger:tlid",
"tiger:source",
"tiger:separated",
"odbl": true,
"odbl:note": true,
"geobase:datasetName",
"geobase:uuid",
"sub_sea:type",
"tiger:upload_uuid": true,
"tiger:tlid": true,
"tiger:source": true,
"tiger:separated": true,
"KSJ2:ADS",
"KSJ2:ARE",
"KSJ2:AdminArea",
"KSJ2:COP_label",
"KSJ2:DFD",
"KSJ2:INT",
"KSJ2:INT_label",
"KSJ2:LOC",
"KSJ2:LPN",
"KSJ2:OPC",
"KSJ2:PubFacAdmin",
"KSJ2:RAC",
"KSJ2:RAC_label",
"KSJ2:RIC",
"KSJ2:RIN",
"KSJ2:WSC",
"KSJ2:coordinate",
"KSJ2:curve_id",
"KSJ2:curve_type",
"KSJ2:filename",
"KSJ2:lake_id",
"KSJ2:lat",
"KSJ2:long",
"KSJ2:river_id",
"yh:LINE_NAME",
"yh:LINE_NUM",
"yh:STRUCTURE",
"yh:TOTYUMONO",
"yh:TYPE",
"yh:WIDTH",
"yh:WIDTH_RANK",
"geobase:datasetName": true,
"geobase:uuid": true,
"SK53_bulk:load"
]
"osmarender:nameDirection": true,
"osmarender:renderName": true,
"osmarender:renderRef": true,
"osmarender:rendernames": true,
"sub_sea:type": true,
"KSJ2:ADS": true,
"KSJ2:ARE": true,
"KSJ2:AdminArea": true,
"KSJ2:COP_label": true,
"KSJ2:DFD": true,
"KSJ2:INT": true,
"KSJ2:INT_label": true,
"KSJ2:LOC": true,
"KSJ2:LPN": true,
"KSJ2:OPC": true,
"KSJ2:PubFacAdmin": true,
"KSJ2:RAC": true,
"KSJ2:RAC_label": true,
"KSJ2:RIC": true,
"KSJ2:RIN": true,
"KSJ2:WSC": true,
"KSJ2:coordinate": true,
"KSJ2:curve_id": true,
"KSJ2:curve_type": true,
"KSJ2:filename": true,
"KSJ2:lake_id": true,
"KSJ2:lat": true,
"KSJ2:long": true,
"KSJ2:river_id": true,
"SK53_bulk:load": true,
"yh:LINE_NAME": true,
"yh:LINE_NUM": true,
"yh:STRUCTURE": true,
"yh:TOTYUMONO": true,
"yh:TYPE": true,
"yh:WIDTH": true,
"yh:WIDTH_RANK": true
}
-349
View File
@@ -1,349 +0,0 @@
{
"circle-stroked-24": { "x": 0, "y": 0, "width": 24, "height": 24 },
"circle-stroked-18": { "x": 24, "y": 0, "width": 18, "height": 18 },
"circle-stroked-12": { "x": 42, "y": 0, "width": 12, "height": 12 },
"circle-24": { "x": 54, "y": 0, "width": 24, "height": 24 },
"circle-18": { "x": 78, "y": 0, "width": 18, "height": 18 },
"circle-12": { "x": 96, "y": 0, "width": 12, "height": 12 },
"square-stroked-24": { "x": 108, "y": 0, "width": 24, "height": 24 },
"square-stroked-18": { "x": 132, "y": 0, "width": 18, "height": 18 },
"square-stroked-12": { "x": 150, "y": 0, "width": 12, "height": 12 },
"square-24": { "x": 162, "y": 0, "width": 24, "height": 24 },
"square-18": { "x": 186, "y": 0, "width": 18, "height": 18 },
"square-12": { "x": 204, "y": 0, "width": 12, "height": 12 },
"triangle-stroked-24": { "x": 216, "y": 0, "width": 24, "height": 24 },
"triangle-stroked-18": { "x": 240, "y": 0, "width": 18, "height": 18 },
"triangle-stroked-12": { "x": 258, "y": 0, "width": 12, "height": 12 },
"triangle-24": { "x": 0, "y": 24, "width": 24, "height": 24 },
"triangle-18": { "x": 24, "y": 24, "width": 18, "height": 18 },
"triangle-12": { "x": 42, "y": 24, "width": 12, "height": 12 },
"star-stroked-24": { "x": 54, "y": 24, "width": 24, "height": 24 },
"star-stroked-18": { "x": 78, "y": 24, "width": 18, "height": 18 },
"star-stroked-12": { "x": 96, "y": 24, "width": 12, "height": 12 },
"star-24": { "x": 108, "y": 24, "width": 24, "height": 24 },
"star-18": { "x": 132, "y": 24, "width": 18, "height": 18 },
"star-12": { "x": 150, "y": 24, "width": 12, "height": 12 },
"cross-24": { "x": 162, "y": 24, "width": 24, "height": 24 },
"cross-18": { "x": 186, "y": 24, "width": 18, "height": 18 },
"cross-12": { "x": 204, "y": 24, "width": 12, "height": 12 },
"marker-stroked-24": { "x": 216, "y": 24, "width": 24, "height": 24 },
"marker-stroked-18": { "x": 240, "y": 24, "width": 18, "height": 18 },
"marker-stroked-12": { "x": 258, "y": 24, "width": 12, "height": 12 },
"marker-24": { "x": 0, "y": 48, "width": 24, "height": 24 },
"marker-18": { "x": 24, "y": 48, "width": 18, "height": 18 },
"marker-12": { "x": 42, "y": 48, "width": 12, "height": 12 },
"religious-jewish-24": { "x": 54, "y": 48, "width": 24, "height": 24 },
"religious-jewish-18": { "x": 78, "y": 48, "width": 18, "height": 18 },
"religious-jewish-12": { "x": 96, "y": 48, "width": 12, "height": 12 },
"religious-christian-24": { "x": 108, "y": 48, "width": 24, "height": 24 },
"religious-christian-18": { "x": 132, "y": 48, "width": 18, "height": 18 },
"religious-christian-12": { "x": 150, "y": 48, "width": 12, "height": 12 },
"religious-muslim-24": { "x": 162, "y": 48, "width": 24, "height": 24 },
"religious-muslim-18": { "x": 186, "y": 48, "width": 18, "height": 18 },
"religious-muslim-12": { "x": 204, "y": 48, "width": 12, "height": 12 },
"cemetery-24": { "x": 216, "y": 48, "width": 24, "height": 24 },
"cemetery-18": { "x": 240, "y": 48, "width": 18, "height": 18 },
"cemetery-12": { "x": 258, "y": 48, "width": 12, "height": 12 },
"rocket-24": { "x": 0, "y": 72, "width": 24, "height": 24 },
"rocket-18": { "x": 24, "y": 72, "width": 18, "height": 18 },
"rocket-12": { "x": 42, "y": 72, "width": 12, "height": 12 },
"airport-24": { "x": 54, "y": 72, "width": 24, "height": 24 },
"airport-18": { "x": 78, "y": 72, "width": 18, "height": 18 },
"airport-12": { "x": 96, "y": 72, "width": 12, "height": 12 },
"heliport-24": { "x": 108, "y": 72, "width": 24, "height": 24 },
"heliport-18": { "x": 132, "y": 72, "width": 18, "height": 18 },
"heliport-12": { "x": 150, "y": 72, "width": 12, "height": 12 },
"rail-24": { "x": 162, "y": 72, "width": 24, "height": 24 },
"rail-18": { "x": 186, "y": 72, "width": 18, "height": 18 },
"rail-12": { "x": 204, "y": 72, "width": 12, "height": 12 },
"rail-metro-24": { "x": 216, "y": 72, "width": 24, "height": 24 },
"rail-metro-18": { "x": 240, "y": 72, "width": 18, "height": 18 },
"rail-metro-12": { "x": 258, "y": 72, "width": 12, "height": 12 },
"rail-light-24": { "x": 0, "y": 96, "width": 24, "height": 24 },
"rail-light-18": { "x": 24, "y": 96, "width": 18, "height": 18 },
"rail-light-12": { "x": 42, "y": 96, "width": 12, "height": 12 },
"bus-24": { "x": 54, "y": 96, "width": 24, "height": 24 },
"bus-18": { "x": 78, "y": 96, "width": 18, "height": 18 },
"bus-12": { "x": 96, "y": 96, "width": 12, "height": 12 },
"fuel-24": { "x": 108, "y": 96, "width": 24, "height": 24 },
"fuel-18": { "x": 132, "y": 96, "width": 18, "height": 18 },
"fuel-12": { "x": 150, "y": 96, "width": 12, "height": 12 },
"parking-24": { "x": 162, "y": 96, "width": 24, "height": 24 },
"parking-18": { "x": 186, "y": 96, "width": 18, "height": 18 },
"parking-12": { "x": 204, "y": 96, "width": 12, "height": 12 },
"parking-garage-24": { "x": 216, "y": 96, "width": 24, "height": 24 },
"parking-garage-18": { "x": 240, "y": 96, "width": 18, "height": 18 },
"parking-garage-12": { "x": 258, "y": 96, "width": 12, "height": 12 },
"airfield-24": { "x": 0, "y": 120, "width": 24, "height": 24 },
"airfield-18": { "x": 24, "y": 120, "width": 18, "height": 18 },
"airfield-12": { "x": 42, "y": 120, "width": 12, "height": 12 },
"roadblock-24": { "x": 54, "y": 120, "width": 24, "height": 24 },
"roadblock-18": { "x": 78, "y": 120, "width": 18, "height": 18 },
"roadblock-12": { "x": 96, "y": 120, "width": 12, "height": 12 },
"ferry-24": { "x": 108, "y": 120, "width": 24, "height": 24 },
"ferry-18": { "x": 132, "y": 120, "width": 18, "height": 18 },
"ferry-12": { "x": 150, "y": 120, "width": 12, "height": 12 },
"harbor-24": { "x": 162, "y": 120, "width": 24, "height": 24 },
"harbor-18": { "x": 186, "y": 120, "width": 18, "height": 18 },
"harbor-12": { "x": 204, "y": 120, "width": 12, "height": 12 },
"bicycle-24": { "x": 216, "y": 120, "width": 24, "height": 24 },
"bicycle-18": { "x": 240, "y": 120, "width": 18, "height": 18 },
"bicycle-12": { "x": 258, "y": 120, "width": 12, "height": 12 },
"park-24": { "x": 0, "y": 144, "width": 24, "height": 24 },
"park-18": { "x": 24, "y": 144, "width": 18, "height": 18 },
"park-12": { "x": 42, "y": 144, "width": 12, "height": 12 },
"park2-24": { "x": 54, "y": 144, "width": 24, "height": 24 },
"park2-18": { "x": 78, "y": 144, "width": 18, "height": 18 },
"park2-12": { "x": 96, "y": 144, "width": 12, "height": 12 },
"museum-24": { "x": 108, "y": 144, "width": 24, "height": 24 },
"museum-18": { "x": 132, "y": 144, "width": 18, "height": 18 },
"museum-12": { "x": 150, "y": 144, "width": 12, "height": 12 },
"lodging-24": { "x": 162, "y": 144, "width": 24, "height": 24 },
"lodging-18": { "x": 186, "y": 144, "width": 18, "height": 18 },
"lodging-12": { "x": 204, "y": 144, "width": 12, "height": 12 },
"monument-24": { "x": 216, "y": 144, "width": 24, "height": 24 },
"monument-18": { "x": 240, "y": 144, "width": 18, "height": 18 },
"monument-12": { "x": 258, "y": 144, "width": 12, "height": 12 },
"zoo-24": { "x": 0, "y": 168, "width": 24, "height": 24 },
"zoo-18": { "x": 24, "y": 168, "width": 18, "height": 18 },
"zoo-12": { "x": 42, "y": 168, "width": 12, "height": 12 },
"garden-24": { "x": 54, "y": 168, "width": 24, "height": 24 },
"garden-18": { "x": 78, "y": 168, "width": 18, "height": 18 },
"garden-12": { "x": 96, "y": 168, "width": 12, "height": 12 },
"campsite-24": { "x": 108, "y": 168, "width": 24, "height": 24 },
"campsite-18": { "x": 132, "y": 168, "width": 18, "height": 18 },
"campsite-12": { "x": 150, "y": 168, "width": 12, "height": 12 },
"theatre-24": { "x": 162, "y": 168, "width": 24, "height": 24 },
"theatre-18": { "x": 186, "y": 168, "width": 18, "height": 18 },
"theatre-12": { "x": 204, "y": 168, "width": 12, "height": 12 },
"art-gallery-24": { "x": 216, "y": 168, "width": 24, "height": 24 },
"art-gallery-18": { "x": 240, "y": 168, "width": 18, "height": 18 },
"art-gallery-12": { "x": 258, "y": 168, "width": 12, "height": 12 },
"pitch-24": { "x": 0, "y": 192, "width": 24, "height": 24 },
"pitch-18": { "x": 24, "y": 192, "width": 18, "height": 18 },
"pitch-12": { "x": 42, "y": 192, "width": 12, "height": 12 },
"soccer-24": { "x": 54, "y": 192, "width": 24, "height": 24 },
"soccer-18": { "x": 78, "y": 192, "width": 18, "height": 18 },
"soccer-12": { "x": 96, "y": 192, "width": 12, "height": 12 },
"america-football-24": { "x": 108, "y": 192, "width": 24, "height": 24 },
"america-football-18": { "x": 132, "y": 192, "width": 18, "height": 18 },
"america-football-12": { "x": 150, "y": 192, "width": 12, "height": 12 },
"tennis-24": { "x": 162, "y": 192, "width": 24, "height": 24 },
"tennis-18": { "x": 186, "y": 192, "width": 18, "height": 18 },
"tennis-12": { "x": 204, "y": 192, "width": 12, "height": 12 },
"basketball-24": { "x": 216, "y": 192, "width": 24, "height": 24 },
"basketball-18": { "x": 240, "y": 192, "width": 18, "height": 18 },
"basketball-12": { "x": 258, "y": 192, "width": 12, "height": 12 },
"baseball-24": { "x": 0, "y": 216, "width": 24, "height": 24 },
"baseball-18": { "x": 24, "y": 216, "width": 18, "height": 18 },
"baseball-12": { "x": 42, "y": 216, "width": 12, "height": 12 },
"golf-24": { "x": 54, "y": 216, "width": 24, "height": 24 },
"golf-18": { "x": 78, "y": 216, "width": 18, "height": 18 },
"golf-12": { "x": 96, "y": 216, "width": 12, "height": 12 },
"swimming-24": { "x": 108, "y": 216, "width": 24, "height": 24 },
"swimming-18": { "x": 132, "y": 216, "width": 18, "height": 18 },
"swimming-12": { "x": 150, "y": 216, "width": 12, "height": 12 },
"cricket-24": { "x": 162, "y": 216, "width": 24, "height": 24 },
"cricket-18": { "x": 186, "y": 216, "width": 18, "height": 18 },
"cricket-12": { "x": 204, "y": 216, "width": 12, "height": 12 },
"skiing-24": { "x": 216, "y": 216, "width": 24, "height": 24 },
"skiing-18": { "x": 240, "y": 216, "width": 18, "height": 18 },
"skiing-12": { "x": 258, "y": 216, "width": 12, "height": 12 },
"school-24": { "x": 0, "y": 240, "width": 24, "height": 24 },
"school-18": { "x": 24, "y": 240, "width": 18, "height": 18 },
"school-12": { "x": 42, "y": 240, "width": 12, "height": 12 },
"college-24": { "x": 54, "y": 240, "width": 24, "height": 24 },
"college-18": { "x": 78, "y": 240, "width": 18, "height": 18 },
"college-12": { "x": 96, "y": 240, "width": 12, "height": 12 },
"library-24": { "x": 108, "y": 240, "width": 24, "height": 24 },
"library-18": { "x": 132, "y": 240, "width": 18, "height": 18 },
"library-12": { "x": 150, "y": 240, "width": 12, "height": 12 },
"post-24": { "x": 162, "y": 240, "width": 24, "height": 24 },
"post-18": { "x": 186, "y": 240, "width": 18, "height": 18 },
"post-12": { "x": 204, "y": 240, "width": 12, "height": 12 },
"fire-station-24": { "x": 216, "y": 240, "width": 24, "height": 24 },
"fire-station-18": { "x": 240, "y": 240, "width": 18, "height": 18 },
"fire-station-12": { "x": 258, "y": 240, "width": 12, "height": 12 },
"town-hall-24": { "x": 0, "y": 264, "width": 24, "height": 24 },
"town-hall-18": { "x": 24, "y": 264, "width": 18, "height": 18 },
"town-hall-12": { "x": 42, "y": 264, "width": 12, "height": 12 },
"police-24": { "x": 54, "y": 264, "width": 24, "height": 24 },
"police-18": { "x": 78, "y": 264, "width": 18, "height": 18 },
"police-12": { "x": 96, "y": 264, "width": 12, "height": 12 },
"prison-24": { "x": 108, "y": 264, "width": 24, "height": 24 },
"prison-18": { "x": 132, "y": 264, "width": 18, "height": 18 },
"prison-12": { "x": 150, "y": 264, "width": 12, "height": 12 },
"embassy-24": { "x": 162, "y": 264, "width": 24, "height": 24 },
"embassy-18": { "x": 186, "y": 264, "width": 18, "height": 18 },
"embassy-12": { "x": 204, "y": 264, "width": 12, "height": 12 },
"beer-24": { "x": 216, "y": 264, "width": 24, "height": 24 },
"beer-18": { "x": 240, "y": 264, "width": 18, "height": 18 },
"beer-12": { "x": 258, "y": 264, "width": 12, "height": 12 },
"restaurant-24": { "x": 0, "y": 288, "width": 24, "height": 24 },
"restaurant-18": { "x": 24, "y": 288, "width": 18, "height": 18 },
"restaurant-12": { "x": 42, "y": 288, "width": 12, "height": 12 },
"cafe-24": { "x": 54, "y": 288, "width": 24, "height": 24 },
"cafe-18": { "x": 78, "y": 288, "width": 18, "height": 18 },
"cafe-12": { "x": 96, "y": 288, "width": 12, "height": 12 },
"shop-24": { "x": 108, "y": 288, "width": 24, "height": 24 },
"shop-18": { "x": 132, "y": 288, "width": 18, "height": 18 },
"shop-12": { "x": 150, "y": 288, "width": 12, "height": 12 },
"fast-food-24": { "x": 162, "y": 288, "width": 24, "height": 24 },
"fast-food-18": { "x": 186, "y": 288, "width": 18, "height": 18 },
"fast-food-12": { "x": 204, "y": 288, "width": 12, "height": 12 },
"bar-24": { "x": 216, "y": 288, "width": 24, "height": 24 },
"bar-18": { "x": 240, "y": 288, "width": 18, "height": 18 },
"bar-12": { "x": 258, "y": 288, "width": 12, "height": 12 },
"bank-24": { "x": 0, "y": 312, "width": 24, "height": 24 },
"bank-18": { "x": 24, "y": 312, "width": 18, "height": 18 },
"bank-12": { "x": 42, "y": 312, "width": 12, "height": 12 },
"grocery-24": { "x": 54, "y": 312, "width": 24, "height": 24 },
"grocery-18": { "x": 78, "y": 312, "width": 18, "height": 18 },
"grocery-12": { "x": 96, "y": 312, "width": 12, "height": 12 },
"cinema-24": { "x": 108, "y": 312, "width": 24, "height": 24 },
"cinema-18": { "x": 132, "y": 312, "width": 18, "height": 18 },
"cinema-12": { "x": 150, "y": 312, "width": 12, "height": 12 },
"pharmacy-24": { "x": 162, "y": 312, "width": 24, "height": 24 },
"pharmacy-18": { "x": 186, "y": 312, "width": 18, "height": 18 },
"pharmacy-12": { "x": 204, "y": 312, "width": 12, "height": 12 },
"hospital-24": { "x": 216, "y": 312, "width": 24, "height": 24 },
"hospital-18": { "x": 240, "y": 312, "width": 18, "height": 18 },
"hospital-12": { "x": 258, "y": 312, "width": 12, "height": 12 },
"danger-24": { "x": 0, "y": 336, "width": 24, "height": 24 },
"danger-18": { "x": 24, "y": 336, "width": 18, "height": 18 },
"danger-12": { "x": 42, "y": 336, "width": 12, "height": 12 },
"industrial-24": { "x": 54, "y": 336, "width": 24, "height": 24 },
"industrial-18": { "x": 78, "y": 336, "width": 18, "height": 18 },
"industrial-12": { "x": 96, "y": 336, "width": 12, "height": 12 },
"warehouse-24": { "x": 108, "y": 336, "width": 24, "height": 24 },
"warehouse-18": { "x": 132, "y": 336, "width": 18, "height": 18 },
"warehouse-12": { "x": 150, "y": 336, "width": 12, "height": 12 },
"commercial-24": { "x": 162, "y": 336, "width": 24, "height": 24 },
"commercial-18": { "x": 186, "y": 336, "width": 18, "height": 18 },
"commercial-12": { "x": 204, "y": 336, "width": 12, "height": 12 },
"building-24": { "x": 216, "y": 336, "width": 24, "height": 24 },
"building-18": { "x": 240, "y": 336, "width": 18, "height": 18 },
"building-12": { "x": 258, "y": 336, "width": 12, "height": 12 },
"place-of-worship-24": { "x": 0, "y": 360, "width": 24, "height": 24 },
"place-of-worship-18": { "x": 24, "y": 360, "width": 18, "height": 18 },
"place-of-worship-12": { "x": 42, "y": 360, "width": 12, "height": 12 },
"alcohol-shop-24": { "x": 54, "y": 360, "width": 24, "height": 24 },
"alcohol-shop-18": { "x": 78, "y": 360, "width": 18, "height": 18 },
"alcohol-shop-12": { "x": 96, "y": 360, "width": 12, "height": 12 },
"logging-24": { "x": 108, "y": 360, "width": 24, "height": 24 },
"logging-18": { "x": 132, "y": 360, "width": 18, "height": 18 },
"logging-12": { "x": 150, "y": 360, "width": 12, "height": 12 },
"oil-well-24": { "x": 162, "y": 360, "width": 24, "height": 24 },
"oil-well-18": { "x": 186, "y": 360, "width": 18, "height": 18 },
"oil-well-12": { "x": 204, "y": 360, "width": 12, "height": 12 },
"slaughterhouse-24": { "x": 216, "y": 360, "width": 24, "height": 24 },
"slaughterhouse-18": { "x": 240, "y": 360, "width": 18, "height": 18 },
"slaughterhouse-12": { "x": 258, "y": 360, "width": 12, "height": 12 },
"dam-24": { "x": 0, "y": 384, "width": 24, "height": 24 },
"dam-18": { "x": 24, "y": 384, "width": 18, "height": 18 },
"dam-12": { "x": 42, "y": 384, "width": 12, "height": 12 },
"water-24": { "x": 54, "y": 384, "width": 24, "height": 24 },
"water-18": { "x": 78, "y": 384, "width": 18, "height": 18 },
"water-12": { "x": 96, "y": 384, "width": 12, "height": 12 },
"wetland-24": { "x": 108, "y": 384, "width": 24, "height": 24 },
"wetland-18": { "x": 132, "y": 384, "width": 18, "height": 18 },
"wetland-12": { "x": 150, "y": 384, "width": 12, "height": 12 },
"disability-24": { "x": 162, "y": 384, "width": 24, "height": 24 },
"disability-18": { "x": 186, "y": 384, "width": 18, "height": 18 },
"disability-12": { "x": 204, "y": 384, "width": 12, "height": 12 },
"telephone-24": { "x": 216, "y": 384, "width": 24, "height": 24 },
"telephone-18": { "x": 240, "y": 384, "width": 18, "height": 18 },
"telephone-12": { "x": 258, "y": 384, "width": 12, "height": 12 },
"emergency-telephone-24": { "x": 0, "y": 408, "width": 24, "height": 24 },
"emergency-telephone-18": { "x": 24, "y": 408, "width": 18, "height": 18 },
"emergency-telephone-12": { "x": 42, "y": 408, "width": 12, "height": 12 },
"toilets-24": { "x": 54, "y": 408, "width": 24, "height": 24 },
"toilets-18": { "x": 78, "y": 408, "width": 18, "height": 18 },
"toilets-12": { "x": 96, "y": 408, "width": 12, "height": 12 },
"waste-basket-24": { "x": 108, "y": 408, "width": 24, "height": 24 },
"waste-basket-18": { "x": 132, "y": 408, "width": 18, "height": 18 },
"waste-basket-12": { "x": 150, "y": 408, "width": 12, "height": 12 },
"music-24": { "x": 162, "y": 408, "width": 24, "height": 24 },
"music-18": { "x": 186, "y": 408, "width": 18, "height": 18 },
"music-12": { "x": 204, "y": 408, "width": 12, "height": 12 },
"land-use-24": { "x": 216, "y": 408, "width": 24, "height": 24 },
"land-use-18": { "x": 240, "y": 408, "width": 18, "height": 18 },
"land-use-12": { "x": 258, "y": 408, "width": 12, "height": 12 },
"city-24": { "x": 0, "y": 432, "width": 24, "height": 24 },
"city-18": { "x": 24, "y": 432, "width": 18, "height": 18 },
"city-12": { "x": 42, "y": 432, "width": 12, "height": 12 },
"town-24": { "x": 54, "y": 432, "width": 24, "height": 24 },
"town-18": { "x": 78, "y": 432, "width": 18, "height": 18 },
"town-12": { "x": 96, "y": 432, "width": 12, "height": 12 },
"village-24": { "x": 108, "y": 432, "width": 24, "height": 24 },
"village-18": { "x": 132, "y": 432, "width": 18, "height": 18 },
"village-12": { "x": 150, "y": 432, "width": 12, "height": 12 },
"farm-24": { "x": 162, "y": 432, "width": 24, "height": 24 },
"farm-18": { "x": 186, "y": 432, "width": 18, "height": 18 },
"farm-12": { "x": 204, "y": 432, "width": 12, "height": 12 },
"bakery-24": { "x": 216, "y": 432, "width": 24, "height": 24 },
"bakery-18": { "x": 240, "y": 432, "width": 18, "height": 18 },
"bakery-12": { "x": 258, "y": 432, "width": 12, "height": 12 },
"dog-park-24": { "x": 0, "y": 456, "width": 24, "height": 24 },
"dog-park-18": { "x": 24, "y": 456, "width": 18, "height": 18 },
"dog-park-12": { "x": 42, "y": 456, "width": 12, "height": 12 },
"lighthouse-24": { "x": 54, "y": 456, "width": 24, "height": 24 },
"lighthouse-18": { "x": 78, "y": 456, "width": 18, "height": 18 },
"lighthouse-12": { "x": 96, "y": 456, "width": 12, "height": 12 },
"clothing-store-24": { "x": 108, "y": 456, "width": 24, "height": 24 },
"clothing-store-18": { "x": 132, "y": 456, "width": 18, "height": 18 },
"clothing-store-12": { "x": 150, "y": 456, "width": 12, "height": 12 },
"polling-place-24": { "x": 162, "y": 456, "width": 24, "height": 24 },
"polling-place-18": { "x": 186, "y": 456, "width": 18, "height": 18 },
"polling-place-12": { "x": 204, "y": 456, "width": 12, "height": 12 },
"playground-24": { "x": 216, "y": 456, "width": 24, "height": 24 },
"playground-18": { "x": 240, "y": 456, "width": 18, "height": 18 },
"playground-12": { "x": 258, "y": 456, "width": 12, "height": 12 },
"entrance-24": { "x": 0, "y": 480, "width": 24, "height": 24 },
"entrance-18": { "x": 24, "y": 480, "width": 18, "height": 18 },
"entrance-12": { "x": 42, "y": 480, "width": 12, "height": 12 },
"heart-24": { "x": 54, "y": 480, "width": 24, "height": 24 },
"heart-18": { "x": 78, "y": 480, "width": 18, "height": 18 },
"heart-12": { "x": 96, "y": 480, "width": 12, "height": 12 },
"london-underground-24": { "x": 108, "y": 480, "width": 24, "height": 24 },
"london-underground-18": { "x": 132, "y": 480, "width": 18, "height": 18 },
"london-underground-12": { "x": 150, "y": 480, "width": 12, "height": 12 },
"minefield-24": { "x": 162, "y": 480, "width": 24, "height": 24 },
"minefield-18": { "x": 186, "y": 480, "width": 18, "height": 18 },
"minefield-12": { "x": 204, "y": 480, "width": 12, "height": 12 },
"rail-underground-24": { "x": 216, "y": 480, "width": 24, "height": 24 },
"rail-underground-18": { "x": 240, "y": 480, "width": 18, "height": 18 },
"rail-underground-12": { "x": 258, "y": 480, "width": 12, "height": 12 },
"rail-above-24": { "x": 0, "y": 504, "width": 24, "height": 24 },
"rail-above-18": { "x": 24, "y": 504, "width": 18, "height": 18 },
"rail-above-12": { "x": 42, "y": 504, "width": 12, "height": 12 },
"camera-24": { "x": 54, "y": 504, "width": 24, "height": 24 },
"camera-18": { "x": 78, "y": 504, "width": 18, "height": 18 },
"camera-12": { "x": 96, "y": 504, "width": 12, "height": 12 },
"laundry-24": { "x": 108, "y": 504, "width": 24, "height": 24 },
"laundry-18": { "x": 132, "y": 504, "width": 18, "height": 18 },
"laundry-12": { "x": 150, "y": 504, "width": 12, "height": 12 },
"car-24": { "x": 162, "y": 504, "width": 24, "height": 24 },
"car-18": { "x": 186, "y": 504, "width": 18, "height": 18 },
"car-12": { "x": 204, "y": 504, "width": 12, "height": 12 },
"suitcase-24": { "x": 216, "y": 504, "width": 24, "height": 24 },
"suitcase-18": { "x": 240, "y": 504, "width": 18, "height": 18 },
"suitcase-12": { "x": 258, "y": 504, "width": 12, "height": 12 },
"hairdresser-24": { "x": 0, "y": 528, "width": 24, "height": 24 },
"hairdresser-18": { "x": 24, "y": 528, "width": 18, "height": 18 },
"hairdresser-12": { "x": 42, "y": 528, "width": 12, "height": 12 },
"chemist-24": { "x": 54, "y": 528, "width": 24, "height": 24 },
"chemist-18": { "x": 78, "y": 528, "width": 18, "height": 18 },
"chemist-12": { "x": 96, "y": 528, "width": 12, "height": 12 },
"mobilephone-24": { "x": 108, "y": 528, "width": 24, "height": 24 },
"mobilephone-18": { "x": 132, "y": 528, "width": 18, "height": 18 },
"mobilephone-12": { "x": 150, "y": 528, "width": 12, "height": 12 },
"scooter-24": { "x": 162, "y": 528, "width": 24, "height": 24 },
"scooter-18": { "x": 186, "y": 528, "width": 18, "height": 18 },
"scooter-12": { "x": 204, "y": 528, "width": 12, "height": 12 },
"gift-24": { "x": 216, "y": 528, "width": 24, "height": 24 },
"gift-18": { "x": 240, "y": 528, "width": 18, "height": 18 },
"gift-12": { "x": 258, "y": 528, "width": 12, "height": 12 },
"ice-cream-24": { "x": 0, "y": 552, "width": 24, "height": 24 },
"ice-cream-18": { "x": 24, "y": 552, "width": 18, "height": 18 },
"ice-cream-12": { "x": 42, "y": 552, "width": 12, "height": 12 }}
+78760 -48759
View File
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+29502
View File
File diff suppressed because it is too large Load Diff
+503
View File
@@ -0,0 +1,503 @@
{
"localizeStrings": {
"this node": "this_node",
"this way": "this_way",
"this relation": "this_relation",
"this one-way": "this_oneway",
"this highway": "this_highway",
"this railway": "this_railway",
"this waterway": "this_waterway",
"this cycleway": "this_cycleway",
"this footpath": "this_footpath",
"this cycleway/footpath": "this_cycleway_footpath",
"this riverbank": "this_riverbank",
"this crossing": "this_crossing",
"this railway crossing": "this_railway_crossing",
"this bridge": "this_bridge",
"this tunnel": "this_tunnel",
"this boundary": "this_boundary",
"this turn-restriction": "this_turn_restriction",
"this roundabout": "this_roundabout",
"this mini-roundabout": "this_mini_roundabout",
"this track": "this_track",
"this feature": "this_feature",
"highway": "highway",
"railway": "railway",
"waterway": "waterway",
"cycleway": "cycleway",
"cycleway_footpath": "cycleway/footpath",
"riverbank": "riverbank",
"place_of_worship": "place_of_worship",
"pub": "pub",
"restaurant": "restaurant",
"school": "school",
"university": "university",
"hospital": "hospital",
"library": "library",
"theatre": "theatre",
"courthouse": "courthouse",
"bank": "bank",
"cinema": "cinema",
"pharmacy": "pharmacy",
"cafe": "cafe",
"fast_food": "fast_food",
"fuel": "fuel",
"from": "from",
"to": "to",
"left-hand": "left_hand",
"right-hand": "right_hand"
},
"errorTypes": {
"20": {
"title": "multiple nodes on the same spot",
"severity": "warning",
"description": "There is more than one node in this spot. Offending node IDs: $1",
"IDs": ["20"],
"regex": "IDs: ((?:#\\d+,?)+)"
},
"30": {
"title": "non-closed_areas",
"severity": "error",
"description": "This way is tagged with '$1' and should be closed-loop.",
"IDs": ["this", ""],
"regex": "(this way) is tagged with '(.+)'"
},
"40": {
"title": "dead-ended one-ways",
"severity": "error",
"description": "The first node (id $1) of this one-way is not connected to any other way",
"IDs": ["n", "this"],
"regex": "\\(id (\\d+)\\) of (this one-way)"
},
"41": {
"title": "",
"severity": "error",
"description": "The last node (id $1) of this one-way is not connected to any other way",
"IDs": ["n", "this"],
"regex": "\\(id (\\d+)\\) of (this one-way)"
},
"42": {
"title": "",
"severity": "error",
"description": "This node cannot be reached because one-ways only lead away from here",
"IDs": ["this"],
"regex": "(this node)"
},
"43": {
"title": "",
"severity": "error",
"description": "You cannot escape from this node because one-ways only lead to here",
"IDs": ["this"],
"regex": "(this node)"
},
"50": {
"title": "almost-junctions",
"severity": "error",
"description": "This node is very close but not connected to way #$1",
"IDs": ["this", "w"],
"regex": "(this node) is very close but not connected to way #(\\d+)"
},
"60": {
"title": "deprecated tags",
"severity": "warning",
"description": "This $1 uses deprecated tag $2. Please use $3 instead!",
"IDs": ["this", "", ""],
"regex": "(this (?:node|way|relation)) uses deprecated tag '(.+)'\\. Please use &quot;(.+)&quot;"
},
"70": {
"title": "missing tags",
"severity": "error",
"description": "This $1 has an empty tag: $2",
"IDs": ["this", ""],
"regex": "(this (?:node|way|relation)) has an empty tag: &quot;(.+)=&quot;"
},
"71": {
"title": "",
"severity": "error",
"description": "This way has no tags",
"IDs": ["this"],
"regex": "(this way)"
},
"72": {
"title": "",
"severity": "error",
"description": "This node is not member of any way and does not have any tags",
"IDs": ["this"],
"regex": "(this node)"
},
"73": {
"title": "",
"severity": "error",
"description": "This way has a $1 tag but no highway tag",
"IDs": ["this", ""],
"regex": "(this way) has a (.+) tag"
},
"74": {
"title": "missing tags",
"severity": "error",
"description": "This $1 has an empty tag: $2",
"IDs": ["this", ""],
"regex": "(this (?:node|way|relation)) has an empty tag: &quot;(.+)=&quot;"
},
"75": {
"description": "This (node|way|relation) has a name \\((.+)\\) but no other tag",
"IDs": ["this", ""],
"regex": "(this (?:node|way|relation)) has a name \\((.+)\\)"
},
"90": {
"title": "motorways without ref",
"severity": "error",
"description": "This way is tagged as motorway and therefore needs a ref nat_ref or int_ref tag",
"IDs": ["this"],
"regex": "(this way)"
},
"100": {
"title": "places of worship without religion",
"severity": "error",
"description": "This $1 is tagged as place of worship and therefore needs a religion tag",
"IDs": ["this"],
"regex": "(this (?:node|way|relation))"
},
"110": {
"title": "point of interest without name",
"severity": "error",
"description": "This node is tagged as $1 and therefore needs a name tag",
"IDs": ["this", ""],
"regex": "(this (?:node|way|relation)) is tagged as (.+) and"
},
"120": {
"title": "ways without nodes",
"severity": "error",
"description": "This way has just one single node",
"IDs": ["this"],
"regex": "(this way)"
},
"130": {
"title": "floating islands",
"severity": "error",
"description": "This way is not connected to the rest of the map",
"IDs": ["this"],
"regex": "(this way)"
},
"150": {
"title": "railway crossing without tag",
"severity": "error",
"description": "This crossing of a highway and a railway needs to be tagged as railway=crossing or railway=level_crossing",
"IDs": ["this"],
"regex": "(this crossing)"
},
"160": {
"title": "wrongly used railway tag",
"severity": "error",
"description": "There are ways in different layers coming together in this railway crossing. There are ways tagged as tunnel or bridge coming together in this railway crossing",
"IDs": ["this"],
"regex": "(this railway crossing)"
},
"170": {
"title": "FIXME tagged items",
"severity": "error",
"description": "This feature has a FIXME tag: (.*)",
"IDs": ["this"],
"regex": "(this feature) has a FIXME tag: (.*)"
},
"180": {
"title": "relations without type",
"severity": "error",
"description": "This relation has no type tag which is mandatory for relations",
"IDs": ["this"],
"regex": "(this relation)"
},
"190": {
"title": "intersections without junctions",
"severity": "error",
"description": "This $1 intersects the $2 #$3 but there is no junction node",
"IDs": ["this", "", "w"],
"regex": "(this .+) intersects the (.+) #(\\d+)"
},
"200": {
"title": "overlapping ways",
"severity": "error",
"description": "This $1 overlaps the $2 #$3",
"IDs": ["this", "", "w"],
"regex": "(this .+) overlaps the (.+) #(\\d+)"
},
"210": {
"title": "loopings",
"severity": "error",
"description": "These errors contain self intersecting ways"
},
"211": {
"title": "",
"severity": "error",
"description": "This way contains more than one node at least twice. Nodes are $1.",
"IDs": ["this", "211"],
"regex": "(this way) contains more than one node at least twice. Nodes are ((?:#\\d+(?:, )?)+)\\."
},
"212": {
"title": "",
"severity": "error",
"description": "This way has only two different nodes and contains one of them more than once",
"IDs": ["this"],
"regex": "(this way)"
},
"220": {
"title": "misspelled tags",
"severity": "error",
"description": "This $1 is tagged '$2' where $3 looks like $4",
"regex": "(this (?:node|way|relation)) is tagged '(.+)' where &quot;(.+)&quot; looks like &quot;(.+)&quot;"
},
"221": {
"title": "",
"severity": "error",
"description": "The key of this $1's tag is 'key': $2",
"regex": "(this (?:node|way|relation))\\'s tag is \\'key\\': (.+)"
},
"230": {
"title": "layer conflicts",
"severity": "error",
"description": "This node is a junction of ways on different layers.",
"IDs": ["this"],
"regex": "(this node)"
},
"231": {
"title": "mixed layers intersection",
"severity": "error",
"description": "This node is a junction of ways on different layers: $1",
"IDs": ["this", "231"],
"regex": "(this node) is a junction of ways on different layers: (.+)"
},
"232": {
"title": "strange layers",
"severity": "error",
"description": "This $1 is tagged with layer $2. This need not be an error, but it looks strange",
"IDs": ["this", ""],
"regex": "(this (?:bridge|tunnel)) is tagged with layer (-?\\d+)\\."
},
"270": {
"title": "motorways connected directly",
"severity": "error",
"description": "This node is a junction of a motorway and a highway other than motorway, motorway_link, trunk, rest_area or construction. Service or unclassified is only valid if it has access=no/private or it leads to a motorway service area or if it is a service=parking_aisle.",
"IDs": ["this"],
"regex": "(this node)"
},
"280": {
"title": "boundaries",
"severity": "error",
"description": "Administrative Boundaries can be expressed either by tagging ways or by adding them to a relation. They should be closed-loop sequences of ways, they must not self-intersect or split and they must have a name and an admin_level."
},
"281": {
"title": "missing name",
"severity": "error",
"description": "This boundary has no name",
"IDs": ["this"],
"regex": "(this boundary)"
},
"282": {
"title": "missing admin level",
"severity": "error",
"description": "The boundary of $1 has no (?:valid numeric)?admin_level",
"regex": "of (.+) has"
},
"283": {
"title": "no closed loop",
"severity": "error",
"description": "The boundary of $1 is not closed-loop",
"regex": "boundary of (.+) is"
},
"284": {
"title": "splitting boundary",
"severity": "error",
"description": "The boundary of $1 splits here",
"regex": "boundary of (.+) splits"
},
"285": {
"title": "admin_level too high",
"severity": "error",
"description": "This boundary-way has admin_level $1 but belongs to a relation with lower admin_level (higher priority); it should have the lowest admin_level of all relations",
"IDs": ["this", ""],
"regex": "(this boundary)-way has admin_level (-?\\d+) but"
},
"290": {
"title": "restrictions",
"severity": "error",
"description": "Analyses all relations tagged type=restriction or following variations type=restriction:hgv type=restriction:caravan type=restriction:motorcar type=restriction:bus type=restriction:agricultural type=restriction:motorcycle type=restriction:bicycle and type=restriction:hazmat"
},
"291": {
"title": "missing type",
"severity": "error",
"description": "This turn-restriction has no (?:known )?restriction type",
"IDs": ["this"],
"regex": "(this turn-restriction) has"
},
"292": {
"title": "missing from way",
"severity": "error",
"description": "This turn-restriction needs exactly one from member. This one has $1",
"IDs": ["this", ""],
"regex": "(this turn-restriction) needs.+has (\\d+)"
},
"293": {
"title": "missing to way",
"severity": "error",
"description": "This turn-restriction needs exactly one to member. This one has $1",
"IDs": ["this", ""],
"regex": "(this turn-restriction) needs.+has (\\d+)"
},
"294": {
"title": "from or to not a way",
"severity": "error",
"description": "From- and To-members of this turn-restriction need to be ways. $1",
"IDs": ["this", "294"],
"regex": "(this turn-restriction)~.+ways\\. ((?:(?:from|to) (?:node|relation) #\\d+,?)+)"
},
"295": {
"title": "via is not on the way ends",
"severity": "error",
"description": "via (node #$1) is not the first or the last member of (from|to) (way #$3)",
"IDs": ["this", "n", "", "w"],
"regex": "(this turn-restriction)~via \\(node #(\\d+)\\).+ of (from|to) \\(way #(\\d+)\\)"
},
"296": {
"title": "wrong restriction angle",
"severity": "error",
"description": "This turn-restriction type is $1, but angle is $2 degrees. Maybe the restriction type is not appropriate?",
"IDs": ["this", "", ""],
"regex": "(this turn-restriction)~.+is (\\w+), but angle is (-?\\d+)"
},
"297": {
"title": "wrong direction of to member",
"severity": "error",
"description": "wrong direction of to way $1",
"IDs": ["this", "w"],
"regex": "(this turn-restriction)~.+to way (\\d+)"
},
"298": {
"title": "already restricted by oneway",
"severity": "error",
"description": "entry already prohibited by oneway tag on $1",
"IDs": ["this", "w"],
"regex": "(this turn-restriction)~.+tag on (\\d+)"
},
"300": {
"title": "missing maxspeed",
"severity": "warning",
"description": "This highway is missing a maxspeed tag",
"IDs": ["this"],
"regex": "(this highway)"
},
"310": {
"title": "roundabouts",
"severity": "error",
"description": "Analyses ways with tag junction=roundabout. More then one way can form a roundabout. It supports tag oneway=-1"
},
"311": {
"title": "not closed loop",
"severity": "error",
"description": "This way is part of a roundabout but is not closed-loop. (split carriageways approaching a roundabout should not be tagged as roundabout)",
"IDs": ["this"],
"regex": "(this way)"
},
"312": {
"title": "wrong direction",
"severity": "error",
"description": "If this ((?:mini_)?roundabout) is in a country with (left|right)-hand traffic then its orientation goes the wrong way around",
"IDs": ["this", ""],
"regex": "(this (?:mini_)?roundabout) is in a country with ((?:left|right)-hand)"
},
"313": {
"title": "faintly connected",
"severity": "error",
"description": "This roundabout has only $1 other roads connected. Roundabouts typically have three",
"IDs": ["this", ""],
"regex": "(this roundabout) has only (\\d) other"
},
"320": {
"title": "*_link connections",
"severity": "error",
"description": "This way is tagged as highway=$1_link but doesn't have a connection to any other $1 or $1_link",
"IDs": ["this", "", "", "", ""],
"regex": "(this way) is tagged as (highway=.+) but doesn't have a connection to any other (.+) or (.+)"
},
"350": {
"title": "bridge-tags",
"severity": "error",
"description": "This bridge does not have a tag in common with its surrounding ways that shows the purpose of this bridge. There should be one of these tags: (.+)",
"NOTE": "Group can be arbitrary list of form: key=value,key=value,key=value...",
"IDs": ["this", ""],
"regex": "(this bridge).*tags: (.+)"
},
"360": {
"title": "language unknown",
"severity": "warning",
"description": "It would be nice if this (node|way|relation) had an additional tag 'name:XX=(.+)' where XX shows the language of its name '\\2'",
"IDs": ["this", ""],
"regex": "(this (?:node|way|relation)) had an additional tag 'name:XX=(.+)' where"
},
"370": {
"title": "doubled places",
"severity": "error",
"description": "This node has tags in common with the surrounding way #$1 ((?:\\(including the name '.+'\\) )?)and seems to be redundand",
"IDs": ["this", "w", "370"],
"regex": "(this node) has tags in common with the surrounding way #(\\d+) ((?:\\(including the name '.+'\\) )?)and"
},
"380": {
"title": "non-physical use of sport-tag",
"severity": "error",
"description": "This way is tagged sport=$1 but has no physical tag like e.g. leisure, building, amenity or highway",
"IDs": ["this", ""],
"regex": "(this way) is tagged (sport=.+) but"
},
"390": {
"title": "missing tracktype",
"severity": "warning",
"description": "This track doesn''t have a tracktype",
"IDs": ["this"],
"regex": "(this track)"
},
"400": {
"title": "geometry glitches",
"severity": "error",
"description": ""
},
"401": {
"title": "missing turn restriction",
"severity": "error",
"description": "ways $1 and $2 join in a very sharp angle here and there is no oneway tag or turn restriction that prevents turning( from way (\\1|\\2) to (\\1|\\2))?",
"IDs": ["w", "w"],
"regex": "ways (\\d+) and (\\d+) join"
},
"402": {
"title": "impossible angles",
"severity": "error",
"description": "this way bends in a very sharp angle here",
"IDs": ["this"],
"regex": "(this way)"
},
"410": {
"title": "website",
"severity": "error",
"description": "Web pages are analyzed. Web page is defined by any of the following tags website=* url=* website:mobile=* contact:website=* contact:url=* image=* source:website=* or source:url=*"
},
"411": {
"title": "http error",
"severity": "error",
"description": "The URL (<a target=_blank href=$1>$1</a>) cannot be opened (HTTP status code $2)",
"IDs": ["this", "url", ""],
"regex": "(this feature)~.+ href=([^>]+)>.+ code (\\d+)\\)"
},
"412": {
"title": "domain hijacking",
"severity": "error",
"description": "Possible domain squatting: <a target=_blank href=$1>$1</a>. Suspicious text is: \"$2\"",
"IDs": ["this", "url", ""],
"regex": "(this feature)~.+ href=([^>]+)>.+ is: &quot;(.+)&quot;"
},
"413": {
"title": "non-match",
"severity": "error",
"description": "Content of the URL (<a target=_blank href=$1>$1</a>) did not contain these keywords: ($2)",
"IDs": ["this", "url", ""],
"regex": "(this feature)~.+ href=([^>]+)>.+ keywords: \\((.+)\\)"
}
}
}
+235
View File
@@ -0,0 +1,235 @@
{
"af": {"nativeName": "Afrikaans"},
"agq": {"nativeName": "Aghem"},
"ak": {"nativeName": "Akan"},
"am": {"nativeName": "አማርኛ"},
"ar": {"nativeName": "العربية"},
"as": {"nativeName": "অসমীয়া"},
"asa": {"nativeName": "Kipare"},
"ast": {"nativeName": "asturianu"},
"az": {"nativeName": "azərbaycan"},
"az-Cyrl": {"base": "az", "script": "Cyrl"},
"az-Latn": {"base": "az", "script": "Latn"},
"bas": {"nativeName": "Ɓàsàa"},
"be": {"nativeName": "беларуская"},
"bem": {"nativeName": "Ichibemba"},
"bez": {"nativeName": "Hibena"},
"bg": {"nativeName": "български"},
"bm": {"nativeName": "bamanakan"},
"bn": {"nativeName": "বাংলা"},
"bo": {"nativeName": "བོད་སྐད་"},
"br": {"nativeName": "brezhoneg"},
"brx": {"nativeName": "बड़ो"},
"bs": {"nativeName": "bosanski"},
"bs-Cyrl": {"base": "bs", "script": "Cyrl"},
"bs-Latn": {"base": "bs", "script": "Latn"},
"ca": {"nativeName": "català"},
"ccp": {"nativeName": "𑄌𑄋𑄴𑄟𑄳𑄦"},
"ce": {"nativeName": "нохчийн"},
"ceb": {"nativeName": "Binisaya"},
"cgg": {"nativeName": "Rukiga"},
"chr": {"nativeName": "ᏣᎳᎩ"},
"ckb": {"nativeName": "کوردیی ناوەندی"},
"cs": {"nativeName": "čeština"},
"cu": {"nativeName": "cu"},
"cy": {"nativeName": "Cymraeg"},
"da": {"nativeName": "dansk"},
"dav": {"nativeName": "Kitaita"},
"de": {"nativeName": "Deutsch"},
"dje": {"nativeName": "Zarmaciine"},
"dsb": {"nativeName": "dolnoserbšćina"},
"dua": {"nativeName": "duálá"},
"dyo": {"nativeName": "joola"},
"dz": {"nativeName": "རྫོང་ཁ"},
"ebu": {"nativeName": "Kĩembu"},
"ee": {"nativeName": "Eʋegbe"},
"el": {"nativeName": "Ελληνικά"},
"en": {"nativeName": "English"},
"eo": {"nativeName": "esperanto"},
"es": {"nativeName": "español"},
"et": {"nativeName": "eesti"},
"eu": {"nativeName": "euskara"},
"ewo": {"nativeName": "ewondo"},
"fa": {"nativeName": "فارسی"},
"ff": {"nativeName": "Pulaar"},
"ff-Latn": {"base": "ff", "script": "Latn"},
"fi": {"nativeName": "suomi"},
"fil": {"nativeName": "Filipino"},
"fo": {"nativeName": "føroyskt"},
"fr": {"nativeName": "français"},
"fur": {"nativeName": "furlan"},
"fy": {"nativeName": "Frysk"},
"ga": {"nativeName": "Gaeilge"},
"gd": {"nativeName": "Gàidhlig"},
"gl": {"nativeName": "galego"},
"gsw": {"nativeName": "Schwiizertüütsch"},
"gu": {"nativeName": "ગુજરાતી"},
"guz": {"nativeName": "Ekegusii"},
"gv": {"nativeName": "Gaelg"},
"ha": {"nativeName": "Hausa"},
"haw": {"nativeName": "ʻŌlelo Hawaiʻi"},
"he": {"nativeName": "עברית"},
"hi": {"nativeName": "हिन्दी"},
"hr": {"nativeName": "hrvatski"},
"hsb": {"nativeName": "hornjoserbšćina"},
"hu": {"nativeName": "magyar"},
"hy": {"nativeName": "հայերեն"},
"ia": {"nativeName": "interlingua"},
"id": {"nativeName": "Indonesia"},
"ig": {"nativeName": "Asụsụ Igbo"},
"ii": {"nativeName": "ꆈꌠꉙ"},
"is": {"nativeName": "íslenska"},
"it": {"nativeName": "italiano"},
"ja": {"nativeName": "日本語"},
"ja-Hira": {"base": "ja", "script": "Hira"},
"ja-Latn": {"base": "ja", "script": "Latn"},
"jgo": {"nativeName": "Ndaa"},
"jmc": {"nativeName": "Kimachame"},
"jv": {"nativeName": "Jawa"},
"ka": {"nativeName": "ქართული"},
"kab": {"nativeName": "Taqbaylit"},
"kam": {"nativeName": "Kikamba"},
"kde": {"nativeName": "Chimakonde"},
"kea": {"nativeName": "kabuverdianu"},
"khq": {"nativeName": "Koyra ciini"},
"ki": {"nativeName": "Gikuyu"},
"kk": {"nativeName": "қазақ тілі"},
"kkj": {"nativeName": "kakɔ"},
"kl": {"nativeName": "kalaallisut"},
"kln": {"nativeName": "Kalenjin"},
"km": {"nativeName": "ខ្មែរ"},
"kn": {"nativeName": "ಕನ್ನಡ"},
"ko": {"nativeName": "한국어"},
"ko-Latn": {"base": "ko", "script": "Latn"},
"kok": {"nativeName": "कोंकणी"},
"ks": {"nativeName": "کٲشُر"},
"ksb": {"nativeName": "Kishambaa"},
"ksf": {"nativeName": "rikpa"},
"ksh": {"nativeName": "Kölsch"},
"ku": {"nativeName": "kurdî"},
"kw": {"nativeName": "kernewek"},
"ky": {"nativeName": "кыргызча"},
"lag": {"nativeName": "Kɨlaangi"},
"lb": {"nativeName": "Lëtzebuergesch"},
"lg": {"nativeName": "Luganda"},
"lkt": {"nativeName": "Lakȟólʼiyapi"},
"ln": {"nativeName": "lingála"},
"lo": {"nativeName": "ລາວ"},
"lrc": {"nativeName": "لۊری شومالی"},
"lt": {"nativeName": "lietuvių"},
"lu": {"nativeName": "Tshiluba"},
"luo": {"nativeName": "Dholuo"},
"luy": {"nativeName": "Luluhia"},
"lv": {"nativeName": "latviešu"},
"mas": {"nativeName": "Maa"},
"mer": {"nativeName": "Kĩmĩrũ"},
"mfe": {"nativeName": "kreol morisien"},
"mg": {"nativeName": "Malagasy"},
"mgh": {"nativeName": "Makua"},
"mgo": {"nativeName": "metaʼ"},
"mi": {"nativeName": "Māori"},
"mk": {"nativeName": "македонски"},
"ml": {"nativeName": "മലയാളം"},
"mn": {"nativeName": "монгол"},
"mr": {"nativeName": "मराठी"},
"ms": {"nativeName": "Melayu"},
"mt": {"nativeName": "Malti"},
"mua": {"nativeName": "MUNDAŊ"},
"my": {"nativeName": "မြန်မာ"},
"mzn": {"nativeName": "مازرونی"},
"naq": {"nativeName": "Khoekhoegowab"},
"nb": {"nativeName": "norsk bokmål"},
"nd": {"nativeName": "isiNdebele"},
"nds": {"nativeName": "nds"},
"ne": {"nativeName": "नेपाली"},
"nl": {"nativeName": "Nederlands"},
"nmg": {"nativeName": "nmg"},
"nn": {"nativeName": "nynorsk"},
"nnh": {"nativeName": "Shwóŋò ngiembɔɔn"},
"nus": {"nativeName": "Thok Nath"},
"nyn": {"nativeName": "Runyankore"},
"oc": {"nativeName": "Occitan"},
"om": {"nativeName": "Oromoo"},
"or": {"nativeName": "ଓଡ଼ିଆ"},
"os": {"nativeName": "ирон"},
"pa": {"nativeName": "ਪੰਜਾਬੀ"},
"pa-Arab": {"base": "pa", "script": "Arab"},
"pa-Guru": {"base": "pa", "script": "Guru"},
"pl": {"nativeName": "polski"},
"prg": {"nativeName": "prūsiskan"},
"ps": {"nativeName": "پښتو"},
"pt": {"nativeName": "português"},
"qu": {"nativeName": "Runasimi"},
"rm": {"nativeName": "rumantsch"},
"rn": {"nativeName": "Ikirundi"},
"ro": {"nativeName": "română"},
"rof": {"nativeName": "Kihorombo"},
"root": {"nativeName": "root"},
"ru": {"nativeName": "русский"},
"rw": {"nativeName": "Kinyarwanda"},
"rwk": {"nativeName": "Kiruwa"},
"sah": {"nativeName": "саха тыла"},
"saq": {"nativeName": "Kisampur"},
"sbp": {"nativeName": "Ishisangu"},
"sd": {"nativeName": "سنڌي"},
"se": {"nativeName": "davvisámegiella"},
"seh": {"nativeName": "sena"},
"ses": {"nativeName": "Koyraboro senni"},
"sg": {"nativeName": "Sängö"},
"shi": {"nativeName": "ⵜⴰⵛⵍⵃⵉⵜ"},
"shi-Latn": {"base": "shi", "script": "Latn"},
"shi-Tfng": {"base": "shi", "script": "Tfng"},
"si": {"nativeName": "සිංහල"},
"sk": {"nativeName": "slovenčina"},
"sl": {"nativeName": "slovenščina"},
"smn": {"nativeName": "anarâškielâ"},
"sn": {"nativeName": "chiShona"},
"so": {"nativeName": "Soomaali"},
"sq": {"nativeName": "shqip"},
"sr": {"nativeName": "српски"},
"sr-Cyrl": {"base": "sr", "script": "Cyrl"},
"sr-Latn": {"base": "sr", "script": "Latn"},
"sv": {"nativeName": "svenska"},
"sw": {"nativeName": "Kiswahili"},
"ta": {"nativeName": "தமிழ்"},
"te": {"nativeName": "తెలుగు"},
"teo": {"nativeName": "Kiteso"},
"tg": {"nativeName": "тоҷикӣ"},
"th": {"nativeName": "ไทย"},
"ti": {"nativeName": "ትግርኛ"},
"tk": {"nativeName": "türkmen dili"},
"to": {"nativeName": "lea fakatonga"},
"tr": {"nativeName": "Türkçe"},
"tt": {"nativeName": "татар"},
"twq": {"nativeName": "Tasawaq senni"},
"tzm": {"nativeName": "Tamaziɣt n laṭlaṣ"},
"ug": {"nativeName": "ئۇيغۇرچە"},
"uk": {"nativeName": "українська"},
"ur": {"nativeName": "اردو"},
"uz": {"nativeName": "ozbek"},
"uz-Arab": {"base": "uz", "script": "Arab"},
"uz-Cyrl": {"base": "uz", "script": "Cyrl"},
"uz-Latn": {"base": "uz", "script": "Latn"},
"vai": {"nativeName": "ꕙꔤ"},
"vai-Latn": {"base": "vai", "script": "Latn"},
"vai-Vaii": {"base": "vai", "script": "Vaii"},
"vi": {"nativeName": "Tiếng Việt"},
"vo": {"nativeName": "vo"},
"vun": {"nativeName": "Kyivunjo"},
"wae": {"nativeName": "Walser"},
"wo": {"nativeName": "Wolof"},
"xh": {"nativeName": "isiXhosa"},
"xog": {"nativeName": "Olusoga"},
"yav": {"nativeName": "nuasue"},
"yi": {"nativeName": "ייִדיש"},
"yo": {"nativeName": "Èdè Yorùbá"},
"yue": {"nativeName": "粵語"},
"yue-Hans": {"base": "yue", "script": "Hans"},
"yue-Hant": {"base": "yue", "script": "Hant"},
"zgh": {"nativeName": "ⵜⴰⵎⴰⵣⵉⵖⵜ"},
"zh": {"nativeName": "中文"},
"zh-Hans": {"base": "zh", "script": "Hans", "nativeName": "简体中文"},
"zh-Hant": {"base": "zh", "script": "Hant", "nativeName": "繁體中文"},
"zh_pinyin": {"base": "zh", "script": "Latn"},
"zu": {"nativeName": "isiZulu"}
}
+90 -61
View File
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
+64
View File
@@ -0,0 +1,64 @@
{
"ag": "+1-268-555-1234",
"ai": "+1-264-555-1234",
"as": "+1-684-555-1234",
"at": "+43 1 123 45 67",
"au": "+61 1 2345 6789",
"bb": "+1-246-555-1234",
"bj": "+229 20 12 34 56",
"bm": "+1-441-555-1234",
"bo": "+591 1 2345678",
"br": "+55 11 0982 1098",
"bs": "+1-242-555-1234",
"ca": "+1-226-555-1234",
"ci": "+225 20 12 34 56",
"cn": "+86 10 12345678",
"de": "+49 89 1234567",
"dm": "+1-767-555-1234",
"do": "+1-809-555-1234",
"es": "+34 989 12 34 56",
"fi": "+358 40 123 4567",
"fr": "+33 1 23 45 67 89",
"gb": "+44 1632 961234",
"gd": "+1-473-555-1234",
"gg": "+44 1632 961234",
"gu": "+1-671-555-1234",
"hk": "+852 1234 5678",
"hr": "+385 01 123 4567",
"hu": "+36 1 123 45 67",
"ie": "+353 20 912 3456",
"im": "+44 1632 961234",
"it": "+39 01 123 456",
"je": "+44 1632 961234",
"jm": "+1-876-555-1234",
"jp": "+81-3-1234-5678",
"kn": "+1-869-555-1234",
"ky": "+1-345-555-1234",
"kz": "+7 495 1234567",
"lc": "+1-758-555-1234",
"mp": "+1-670-555-1234",
"ms": "+1-664-555-1234",
"nl": "+31 42 123 4567",
"no": "+47 22 12 34 56",
"pe": "+51 1 1234567",
"pl": "+48 42 123 4567",
"pr": "+1-787-555-1234",
"pt": "+351 211 123456",
"ru": "+7 495 1234567",
"se": "+46 31 123 4567",
"si": "+386 31 123 4567",
"sj": "+47 22 12 34 56",
"sx": "+1-721-555-1234",
"tc": "+1-649-555-1234",
"tr": "+90 312 123 4567",
"tt": "+1-868-555-1234",
"tw": "+886 1 2345 6789",
"ua": "+380 44 123 4567",
"us": "+1-202-555-1234",
"va": "+39 01 123 456",
"vc": "+1-784-555-1234",
"vg": "+1-284-555-1234",
"vi": "+1-340-555-1234",
"vn": "+84 1 234 5678",
"za": "+27 11 907 1111"
}
+6248 -1243
View File
File diff suppressed because it is too large Load Diff
+404 -43
View File
@@ -1,30 +1,36 @@
## Presets
iD uses a simple presets system based on [JSON](http://en.wikipedia.org/wiki/JSON)
preset definitions and simple structure.
iD editor preset and field types are defined in [JSON](http://en.wikipedia.org/wiki/JSON)
files located under the `data/presets` folder of the iD repository.
## Individual Presets
#### Preset Files
Specific presets are located under `data/presets/presets`. They're organized in a
directory hierarchy based on OSM key/value pairs. For example, the preset that matches
Presets are defined in JSON files located under `data/presets/presets`. They're organized in a
directory hierarchy based on OSM key/value pairs. For example, the preset that matches
the tag `leisure=park` is in the file `data/presets/presets/leisure/park.json`.
## Preset Format
#### Preset Schema
A basic preset is of the form:
```javascript
{
// The icon in iD which represents this feature.
"icon": "park",
// An array of field names. See the fields documentation for details of what's valid here.
"icon": "maki-park",
// The names of fields that will appear by default in the editor sidebar.
// See the fields documentation for details of what's valid here.
"fields": [
"address"
],
// The names of fields that the user can add manually. These will also
// appear if the corresponding tags are present.
"moreFields": [
"phone",
"website"
],
// The geometry types for which this preset is valid.
// options are point, area, line, and vertex.
// vertexes are points that are parts of lines, like the nodes
// in a road
// vertexes are points that are parts of lines, like the nodes in a road
// lines are unclosed ways, and areas are closed ways
"geometry": [
"point", "area"
@@ -47,49 +53,404 @@ A basic preset is of the form:
"name": "Park"
}
```
The complete JSON schema for presets can be found in [`data/presets/schema/preset.json`](schema/preset.json)
## Fields
Fields are, like presets, defined in JSON structures. A typical field is
#### Preset Properties
```js
{
"key": "access",
"type": "combo"
##### `name`
The primary name of the feature type in American English.
Upon merging with `develop`, this is sent to Transifex for translating to other localizations. Changing the name of an existing preset will require it to be re-translated to all localizations.
This property is required. There is no default.
##### `geometry`
An array of possible geometry types that a feature must have in order to match this preset.
* `point`: an OSM node that is not a member of any way
* `vertex`: an OSM node that is a member of one or more ways
* `line`: an OSM way that is not an area
* `area`: an OSM way that is closed/circular (the first and last nodes are the same) or a `type=multipolygon` relation
* `relation`: an OSM relation
Closed ways can be treated as both `line` or `area` geometry. If a preset allows both, iD will add an additional `area=yes` tag when choosing the preset for an area feature.
The geometry types should be listed in order of preference. For example, the preset for `leisure=swimming_pool` lists `area` before `point`.
This property is required. There is no default.
##### `tags`
An object with the `"key": "value"` tags a feature must have to match this preset. A `"*"` wildcard value can be set to have this preset match any value for that key.
A features can only match one preset even if its tags and geometry could technically match more than one. iD will pick the best match based on `matchScore`, the number of tags, and the use of wildcard values.
This property is required. There is no default.
##### `addTags`
The tags that are added to the feature when selecting this preset. Defaults to `tags`. If needed, this property will typically be a superset of `tags`.
iD's validator will recommend that users add missing tags from `addTags` to matching features. For example, the Bridge preset has these properties:
```
"tags": {
"man_made": "bridge"
},
"addTags": {
"man_made": "bridge",
"layer": "1"
},
```
When adding a feature with this preset, it will be given the tags `man_made=bridge` and `layer=1`. The user could then change `layer` to `3`, for instance, and the feature would still match the preset because it still has `man_made=bridge`. If the user removes the `layer` tag altogether, iD will recommend adding it back with a value of `1`.
##### `removeTags`
The tags that are removed from the feature when deselecting this preset. Defaults to `addTags` or if this is also not defined, to `tags`.
##### `fields`/`moreFields`
Both these properties are arrays of field paths (e.g. `description` or `generator/type`).
`fields` are shown by default and `moreFields` are shown if manually added by the
user or if a matching tag is present. Note that some fields have a `prerequisiteTag`
property that limits when they will be shown.
A preset can reference the fields of another by using that preset's name contained in
brackets, like `{preset}`. For example, `shop/books` references and extends the fields
of `shop`:
```javascript
"fields": [
"{shop}",
"internet_access"
],
"moreFields": [
"{shop}",
"internet_access/fee",
"internet_access/ssid"
],
"tags": {
"shop": "books"
}
```
In which `type` is the fields's type. Valid field types are
If `fields` or `moreFields` are not defined, the values of the preset's "parent"
preset are used. For example, `shop/convenience` automatically uses the same
fields as `shop`.
* textarea
* radio
* combo
* address
* check - a tri-state checkbox: yes, no, or unknown (no tag)
* defaultcheck - a boolean checkbox where checked produces a `*=yes` tag and
unchecked produces no tag
In both explicit and implicit inheritance, fields for keys that define the
preset are generally not inherited. E.g. the `shop` field is not inherited by `shop/…` presets.
The `key` property names the OSM key that the field will edit. Alternatively, for
compound fields like `address`, you can specify an array of keys in the `keys`
property.
##### `icon`
Each field definition lives in a separate file in `data/presets/fields`. The field
name (used in the preset `fields` property) is the name of the file (minus the `.json`
extension).
The name of a local SVG icon file. You can use icons from any of the following icon sets. When specifying an icon, use the prefixed version of the name, for example `"icon": "maki-park"` or `"icon": "tnp-2009223"`.
## Icons
* [iD's spritesheet](https://github.com/openstreetmap/iD/tree/develop/svg/iD-sprite/presets) (`iD-`)
* [Maki](https://labs.mapbox.com/maki-icons/) (`maki-`), map-specific icons from Mapbox
* [Temaki](https://ideditor.github.io/temaki/docs/) (`temaki-`), an expansion pack for Maki
* This is the best place to submit a PR if you want to create a preset icon!
* [Font Awesome](https://fontawesome.com/icons?d=gallery&m=free), thousands of general-purpose icons
* There is a free and pro tier. You can use any icon from the free tier in the following styles:
* [Solid](https://fontawesome.com/icons?d=gallery&s=solid&m=free) (`fas-`)
* [Regular](https://fontawesome.com/icons?d=gallery&s=regular&m=free) (`far-`)
* [Brands](https://fontawesome.com/icons?d=gallery&s=brands&m=free) (`fab-`)
* [The Noun Project](https://thenounproject.com) (`tnp-`), millions of general-purpose icons
* The licenses vary. You can only use the public-domain icons in iD, such as those from [OCHA Visual](https://thenounproject.com/ochavisual/).
* The icon styles vary. Avoid thin or overly-detailed icons since they will not look good at small sizes.
* Use the numeric ID of the icon (e.g. `2009223`). This is shown in the URL when you select an icon on their site.
* Unfortunately, you must [sign up for a free API key](https://thenounproject.com/developers/) in order to download new icons (even for public-domain icons). Add a file called `the_noun_project.auth` to the root of your local iD instance containing your credentials like `{"consumer_key": "xxxxxx", "consumer_secret": "xxxxxx"}`. This file is not version-controlled.
##### `imageURL`
The URL of a remote image file. This does not fully replace `icon`—both may be shown in the UI.
For example, `imageURL` is used to specify the logos of brand presets from the [name-suggestion-index](https://github.com/osmlab/name-suggestion-index).
Bitmap images should be at least 100x100px to look good at 50x50pt on high-resolution screens.
##### `searchable`
Deprecated or generic presets can include the property `"searchable": false`.
This means that they will be recognized by iD when editing existing data,
but will not be available as an option when adding new features.
By convention, unsearchable presets have filenames that begin with an underscore
(e.g. `data/presets/presets/landuse/_farm.json`)
##### `matchScore`
A number that ranks this preset against others that match the feature.
For example, a feature with `amenity=cafe` and `building=commercial` will match the Cafe preset instead of the Commercial Building preset because Commercial Building has a lower `matchScore`.
The default is `1.0`.
##### `countryCodes`
An array of two-letter, lowercase [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) country codes. The preset will only be searchable when the user is editing over the specified, whitelisted countries. The locale and language of iD are not factors, just the position of the map.
By default, presets are available everywhere.
##### `notCountryCodes`
An array of two-letter, lowercase [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) country codes. Similar to `countryCodes` except a blacklist instead of a whitelist.
##### `replacement`
The ID of a preset that is preferable to this one. iD's validator will flag features matching this preset and recommend that the user upgrade the tags.
When possible, use `deprecated.json` instead to specify upgrade paths for old tags. This property is meant for special cases, such as upgrades with geometry requirements.
##### `reference`
A key and optionally a value to link to the wiki documentation for this preset. Only necessary if the preset consists of several tags.
For example,
```javascript
"reference": {
"key": "tower:type",
"value": "communication"
}
```
## Fields
Fields are reusable form elements that can be associated with presets.
#### Field Files
Fields are defined in JSON files located under `data/presets/fields`.
The field files are typically named according to their associated OSM key.
For example, the field for the tag `sport=*` is stored in the file
`data/presets/fields/sport.json`. When a field has multiple versions that
depend on which preset is active, we add a suffix to the filename:
(`sport.json`, `sport_ice.json`, `sport_racing_motor.json`).
Some keys in OSM are namespaced using colons (':'). Namespaced fields
are nested in folders according to their tag.
For example, the field for the tag `piste:difficulty=*` is stored in the file
`data/presets/fields/piste/difficulty.json`.
#### Field Schema
```js
{
"key": "cuisine",
"type": "combo",
"label": "Cuisine"
}
```
The complete JSON schema for fields can be found in [`data/presets/schema/field.json`](schema/field.json)
#### Field Properties
##### `type`
A string specifying the UI and behavior of the field. Must be one of the following values.
###### Text fields
* `text` - Basic single line text field
* `number` - Text field with up/down buttons for entering numbers (e.g. `width=*`)
* `localized` - Text field with localization abilities (e.g. `name=*`, `name:es=*`, etc.)
* `tel` - Text field for entering phone numbers (localized for editing location)
* `email` - Text field for entering email addresses
* `url` - Text field for entering URLs
* `identifier` - Text field for foreign IDs (e.g. `gnis:feature_id`)
* `textarea` - Multi-line text area (e.g. `description=*`)
###### Combo/Dropdown fields
* `combo` - Dropdown field for picking one option out of many (e.g. `surface=*`)
* `typeCombo` - Dropdown field picking a specific type from a generic category key<br/>
(e.g. `waterway=*`. If unset, tag will be `waterway=yes`, but dropdown contains options like `stream`, `ditch`, `river`)
* `multiCombo` - Dropdown field for adding `yes` values to a common multikey<br/>
(e.g. `recycling:*` -> `recycling:glass=yes`, `recycling:paper=yes`, etc.)
* `networkCombo` - Dropdown field that helps users pick a route `network` tag (localized for editing location)
* `semiCombo` - Dropdown field for adding multiple values to a semicolon-delimited list<br/>
(e.g. `sport=*` -> `soccer;lacrosse;athletics;field_hockey`)
###### Checkboxes
* `check` - 3-state checkbox: `yes`, `no`, unknown (no tag)
* `defaultCheck` - 2-state checkbox where checked produces `yes` and unchecked produces no tag
* `onewayCheck` - 3-state checkbox for `oneway` fields, with extra button for direction switching
###### Radio Buttons
* `radio` - Multiple choice radio button field
* `structureRadio` - Multiple choice structure radio button field, with extra input for bridge/tunnel level
###### Special
* `access` - Block of dropdowns for defining the `access=*` tags on a highway
* `address` - Block of text and dropdown fields for entering address information (localized for editing location)
* `cycleway` - Block of dropdowns for adding `cycleway:left` and `cycleway:right` tags on a highway
* `maxspeed` - Numeric text field for speed and dropdown for "mph/kph"
* `restrictions` - Graphical field for editing turn restrictions
* `wikidata` - Search field for selecting a Wikidata entity
* `wikipedia` - Block of fields for selecting a wiki language and Wikipedia page
##### `key`/`keys`
The `key` property names the OSM key that the field will edit.
Compound fields like `address` expect an array of keys in the `keys` property.
##### `universal`
If a field definition contains the property `"universal": true`, this field will
appear in the "Add Field" list for all presets
##### `geometry`
If specified, only show the field for this kind of geometry. Should contain
one of `point`, `vertex`, `line`, `area`.
##### `default`
The default value for the field. For example, the `building_area.json` field
will automatically add the tag `building=yes` to certain presets that are
associated with building features (but only if drawn as a closed area).
```js
{
"key": "building",
"type": "combo",
"default": "yes",
"geometry": "area",
"label": "Building"
}
```
##### `options`
Combo field types can provide dropdown values in an `options` array.
The user can pick from any of the options, or type their own value.
```js
{
"key": "diaper",
"type": "combo",
"label": "Diaper Changing Available",
"options": ["yes", "no", "room", "1", "2", "3", "4", "5"]
}
```
##### `strings`
Combo field types can accept name-value pairs in the `strings` property.
This is helpful when the field has a fixed number of options and you want to be
able to provide a translatable description of each option. When using `strings`,
the user can not type their own value, they must choose one of the given values.
```js
{
"key": "smoothness",
"type": "combo",
"label": "Smoothness",
"placeholder": "Thin Rollers, Wheels, Off-Road...",
"strings": {
"options": {
"excellent": "Thin Rollers: rollerblade, skateboard",
"good": "Thin Wheels: racing bike",
"intermediate": "Wheels: city bike, wheelchair, scooter",
"bad": "Robust Wheels: trekking bike, car, rickshaw",
"very_bad": "High Clearance: light duty off-road vehicle",
"horrible": "Off-Road: heavy duty off-road vehicle",
"very_horrible": "Specialized off-road: tractor, ATV",
"impassable": "Impassable / No wheeled vehicle"
}
}
}
```
If a combo field does not specify `options` or `strings`, the field will fetch
common tag values from the Taginfo service to use as dropdown values.
##### `snake_case`
For combo fields, spaces are replaced with underscores in the tag value if `snake_case` is `true`. The default is `true`.
##### `caseSensitive`
For combo fields, case-sensitve field values are allowed if `caseSensitive` is `true`. The default is `false`.
##### `min_value`
For number fields, the lowest valid value. There is no default.
##### `max_value`
For number fields, the greatest valid value. There is no default.
##### `prerequisiteTag`
An object defining the tags the feature needs before this field will be displayed. It may have this property:
- `key`: The key for the required tag.
And may optionally be combined with one of these properties:
- `value`: The value that the key must have.
- `valueNot`: The value that the key must not have.
Alternatively, the object may contain a single property:
- `keyNot`: The key that must not be present.
For example, this is how we show the Internet Access Fee field only if the feature has an `internet_access` tag not equal to `no`.
```js
"prerequisiteTag": {
"key": "internet_access",
"valueNot": "no"
}
```
If a feature has a value for this field's `key` or `keys`, it will display regardless of the `prerequisiteTag` property.
##### `countryCodes`
An array of two-letter, lowercase [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) country codes. The field will only be available for features in the specified, whitelisted countries.
By default, fields are available everywhere.
##### `notCountryCodes`
An array of two-letter, lowercase [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) country codes. Similar to `countryCodes` except a blacklist instead of a whitelist.
##### `urlFormat`
For `identifier` fields, the permalink URL of the external record. It must contain a `{value}` placeholder where the tag value will be inserted. For example:
```js
"urlFormat": "https://geonames.usgs.gov/apex/f?p=gnispq:3:::NO::P3_FID:{value}"
```
##### `pattern`
For `identifier` fields, the regular expression that valid values are expected to match to be linkable.
Preset icons in iD are pulled from the open source map icon set,
[Maki](http://www.mapbox.com/maki/).
The icons are identified in iD by the same name as they are on the Maki home. Use those
names when identifying the icon to be used for a given preset.
## Building
To build presets, all you need to do is run `make`.
To build presets, all you need to do is run `npm run build`.
The following files are autogenerated and will be replaced when rebuilding:
* `data/presets/categories.json`
* `data/presets/fields.json`
* `data/presets/presets.json`
* `data/presets.yaml`
* `data/taginfo.json`
* `dist/locales/en.json`
This command will take care of running the build script, which packages all presets
into one file: `dist/presets.js`, which is included in the packaged iD.js file.
## Custom Presets
@@ -97,7 +458,7 @@ iD supports deployments which use a custom set of presets. You can supply preset
the `presets` accessor:
```js
var id = iD().presets({
var id = iD.coreContext().presets({
presets: { ... },
fields: { ... },
defaults: { ... },
@@ -127,13 +488,13 @@ For example:
"point": {
"name": "Point",
"tags": {},
"geometry": ["point"],
"geometry": ["point", "vertex"],
"matchScore": 0.1
},
"vertex": {
"name": "Other",
"relation": {
"name": "Relation",
"tags": {},
"geometry": ["vertex"],
"geometry": ["relation"],
"matchScore": 0.1
}
```
+1 -152
View File
@@ -1,152 +1 @@
{
"category-building": {
"geometry": "area",
"name": "Building Features",
"icon": "building",
"members": [
"building/house",
"building/apartments",
"building/commercial",
"building/industrial",
"building/residential",
"building"
]
},
"category-golf": {
"geometry": "area",
"name": "Golf Features",
"icon": "golf",
"members": [
"golf/fairway",
"golf/green",
"golf/lateral_water_hazard",
"golf/rough",
"golf/bunker",
"golf/tee",
"golf/water_hazard"
]
},
"category-landuse": {
"geometry": "area",
"name": "Land Use Features",
"icon": "land-use",
"members": [
"landuse/residential",
"landuse/industrial",
"landuse/commercial",
"landuse/retail",
"landuse/farmland",
"landuse/farmyard",
"landuse/forest",
"landuse/meadow",
"landuse/cemetery",
"landuse/military"
]
},
"category-path": {
"geometry": "line",
"name": "Path Features",
"icon": "category-path",
"members": [
"highway/pedestrian",
"highway/footway",
"highway/cycleway",
"highway/bridleway",
"highway/path",
"highway/steps"
]
},
"category-rail": {
"geometry": "line",
"name": "Rail Features",
"icon": "category-rail",
"members": [
"railway/rail",
"railway/subway",
"railway/tram",
"railway/monorail",
"railway/disused",
"railway/abandoned"
]
},
"category-restriction": {
"geometry": "relation",
"name": "Restriction Features",
"icon": "restriction",
"members": [
"type/restriction/no_left_turn",
"type/restriction/no_right_turn",
"type/restriction/no_straight_on",
"type/restriction/no_u_turn",
"type/restriction/only_left_turn",
"type/restriction/only_right_turn",
"type/restriction/only_straight_on",
"type/restriction"
]
},
"category-road": {
"geometry": "line",
"name": "Road Features",
"icon": "category-roads",
"members": [
"highway/residential",
"highway/motorway",
"highway/trunk",
"highway/primary",
"highway/secondary",
"highway/tertiary",
"highway/service",
"highway/motorway_link",
"highway/trunk_link",
"highway/primary_link",
"highway/secondary_link",
"highway/tertiary_link",
"highway/unclassified",
"highway/track",
"highway/road"
]
},
"category-route": {
"geometry": "relation",
"name": "Route Features",
"icon": "route",
"members": [
"type/route/road",
"type/route/bicycle",
"type/route/foot",
"type/route/hiking",
"type/route/bus",
"type/route/train",
"type/route/tram",
"type/route/ferry",
"type/route/power",
"type/route/pipeline",
"type/route/detour",
"type/route_master",
"type/route"
]
},
"category-water-area": {
"geometry": "area",
"name": "Water Features",
"icon": "water",
"members": [
"natural/water/lake",
"natural/water/pond",
"natural/water/reservoir",
"natural/water"
]
},
"category-water-line": {
"geometry": "line",
"name": "Water Features",
"icon": "category-water",
"members": [
"waterway/river",
"waterway/stream",
"waterway/canal",
"waterway/ditch",
"waterway/drain"
]
}
}
{"category-barrier": {"icon": "maki-roadblock", "name": "Barrier Features", "members": ["barrier/fence", "barrier/wall", "barrier/ditch", "barrier/gate", "barrier/hedge", "barrier/kerb", "barrier"]}, "category-building": {"icon": "maki-building", "name": "Building Features", "members": ["building", "building/house", "building/apartments", "building/garage", "building/retail", "building/commercial", "building/industrial", "building/residential"]}, "category-golf": {"icon": "maki-golf", "name": "Golf Features", "members": ["golf/fairway", "golf/green", "golf/lateral_water_hazard", "golf/rough", "golf/bunker", "golf/tee", "golf/water_hazard", "golf/driving_range", "golf/hole", "golf/cartpath", "golf/path"]}, "category-landuse": {"icon": "maki-landuse", "name": "Land Use Features", "members": ["landuse/residential", "landuse/industrial", "landuse/commercial", "landuse/retail", "landuse/farmland", "landuse/farmyard", "landuse/forest", "landuse/meadow", "landuse/aquaculture", "landuse/cemetery", "landuse/military", "landuse/religious"]}, "category-natural": {"icon": "maki-natural", "name": "Natural Features", "members": ["natural/water", "natural/wood", "natural/scrub", "natural/wetland", "natural/grassland", "natural/heath", "natural/bare_rock", "natural/beach", "natural/cave_entrance", "natural/glacier", "natural/coastline", "natural/tree_row", "natural/peak", "natural/cliff"]}, "category-path": {"icon": "temaki-pedestrian", "name": "Paths", "members": ["highway/path", "highway/footway", "highway/footway/marked", "highway/footway/sidewalk", "highway/steps", "highway/cycleway", "highway/bridleway", "highway/pedestrian_line"]}, "category-rail": {"icon": "temaki-railway_track", "name": "Rails", "members": ["railway/rail", "railway/disused", "railway/tram", "railway/subway", "railway/narrow_gauge", "railway/light_rail", "railway/monorail", "railway/funicular"]}, "category-restriction": {"icon": "iD-restriction", "name": "Restriction Features", "members": ["type/restriction/no_left_turn", "type/restriction/no_right_turn", "type/restriction/no_straight_on", "type/restriction/no_u_turn", "type/restriction/only_left_turn", "type/restriction/only_right_turn", "type/restriction/only_straight_on", "type/restriction/only_u_turn", "type/restriction"]}, "category-road_major": {"icon": "iD-highway-unclassified", "name": "Major Roads", "members": ["highway/motorway", "highway/trunk", "highway/primary", "highway/secondary", "highway/tertiary", "highway/motorway_link", "highway/trunk_link", "highway/primary_link", "highway/secondary_link", "highway/tertiary_link"]}, "category-road_minor": {"icon": "iD-highway-unclassified", "name": "Minor Roads", "members": ["highway/unclassified", "highway/residential", "highway/living_street", "highway/service", "highway/track"]}, "category-road_service": {"icon": "iD-highway-service", "name": "Service Roads", "members": ["highway/service", "highway/service/parking_aisle", "highway/service/driveway", "highway/service/alley", "highway/service/emergency_access", "highway/service/drive-through"]}, "category-route": {"icon": "iD-route", "name": "Route Features", "members": ["type/route/road", "type/route/bicycle", "type/route/foot", "type/route/hiking", "type/route/horse", "type/route/piste", "type/route/bus", "type/route/train", "type/route/light_rail", "type/route/tram", "type/route/subway", "type/route/ferry", "type/route/power", "type/route/pipeline", "type/route/detour", "type/route_master", "type/route"]}, "category-utility": {"icon": "iD-power-line", "name": "Utility Features", "members": ["power/line", "power/minor_line", "man_made/pipeline", "power/cable/underground"]}, "category-water": {"icon": "maki-water", "name": "Water Bodies", "members": ["natural/water", "natural/water/pond", "natural/water/basin", "natural/water/lake", "natural/water/reservoir"]}, "category-waterway": {"icon": "iD-waterway-stream", "name": "Waterways", "members": ["waterway/stream", "waterway/drain", "waterway/river", "waterway/canal", "waterway/ditch", "natural/water/stream", "natural/water/river", "natural/water/canal"]}}
+13
View File
@@ -0,0 +1,13 @@
{
"icon": "maki-roadblock",
"name": "Barrier Features",
"members": [
"barrier/fence",
"barrier/wall",
"barrier/ditch",
"barrier/gate",
"barrier/hedge",
"barrier/kerb",
"barrier"
]
}
+5 -4
View File
@@ -1,13 +1,14 @@
{
"geometry": "area",
"icon": "maki-building",
"name": "Building Features",
"icon": "building",
"members": [
"building",
"building/house",
"building/apartments",
"building/garage",
"building/retail",
"building/commercial",
"building/industrial",
"building/residential",
"building"
"building/residential"
]
}
+6 -3
View File
@@ -1,7 +1,6 @@
{
"geometry": "area",
"icon": "maki-golf",
"name": "Golf Features",
"icon": "golf",
"members": [
"golf/fairway",
"golf/green",
@@ -9,6 +8,10 @@
"golf/rough",
"golf/bunker",
"golf/tee",
"golf/water_hazard"
"golf/water_hazard",
"golf/driving_range",
"golf/hole",
"golf/cartpath",
"golf/path"
]
}
+4 -3
View File
@@ -1,7 +1,6 @@
{
"geometry": "area",
"icon": "maki-landuse",
"name": "Land Use Features",
"icon": "land-use",
"members": [
"landuse/residential",
"landuse/industrial",
@@ -11,7 +10,9 @@
"landuse/farmyard",
"landuse/forest",
"landuse/meadow",
"landuse/aquaculture",
"landuse/cemetery",
"landuse/military"
"landuse/military",
"landuse/religious"
]
}
+20
View File
@@ -0,0 +1,20 @@
{
"icon": "maki-natural",
"name": "Natural Features",
"members": [
"natural/water",
"natural/wood",
"natural/scrub",
"natural/wetland",
"natural/grassland",
"natural/heath",
"natural/bare_rock",
"natural/beach",
"natural/cave_entrance",
"natural/glacier",
"natural/coastline",
"natural/tree_row",
"natural/peak",
"natural/cliff"
]
}
+7 -6
View File
@@ -1,13 +1,14 @@
{
"geometry": "line",
"name": "Path Features",
"icon": "category-path",
"icon": "temaki-pedestrian",
"name": "Paths",
"members": [
"highway/pedestrian",
"highway/path",
"highway/footway",
"highway/footway/marked",
"highway/footway/sidewalk",
"highway/steps",
"highway/cycleway",
"highway/bridleway",
"highway/path",
"highway/steps"
"highway/pedestrian_line"
]
}
+8 -7
View File
@@ -1,13 +1,14 @@
{
"geometry": "line",
"name": "Rail Features",
"icon": "category-rail",
"icon": "temaki-railway_track",
"name": "Rails",
"members": [
"railway/rail",
"railway/subway",
"railway/tram",
"railway/monorail",
"railway/disused",
"railway/abandoned"
"railway/tram",
"railway/subway",
"railway/narrow_gauge",
"railway/light_rail",
"railway/monorail",
"railway/funicular"
]
}
+2 -2
View File
@@ -1,7 +1,6 @@
{
"geometry": "relation",
"icon": "iD-restriction",
"name": "Restriction Features",
"icon": "restriction",
"members": [
"type/restriction/no_left_turn",
"type/restriction/no_right_turn",
@@ -10,6 +9,7 @@
"type/restriction/only_left_turn",
"type/restriction/only_right_turn",
"type/restriction/only_straight_on",
"type/restriction/only_u_turn",
"type/restriction"
]
}
@@ -1,22 +1,16 @@
{
"geometry": "line",
"name": "Road Features",
"icon": "category-roads",
"icon": "iD-highway-unclassified",
"name": "Major Roads",
"members": [
"highway/residential",
"highway/motorway",
"highway/trunk",
"highway/primary",
"highway/secondary",
"highway/tertiary",
"highway/service",
"highway/motorway_link",
"highway/trunk_link",
"highway/primary_link",
"highway/secondary_link",
"highway/tertiary_link",
"highway/unclassified",
"highway/track",
"highway/road"
"highway/tertiary_link"
]
}
+11
View File
@@ -0,0 +1,11 @@
{
"icon": "iD-highway-unclassified",
"name": "Minor Roads",
"members": [
"highway/unclassified",
"highway/residential",
"highway/living_street",
"highway/service",
"highway/track"
]
}
+12
View File
@@ -0,0 +1,12 @@
{
"icon": "iD-highway-service",
"name": "Service Roads",
"members": [
"highway/service",
"highway/service/parking_aisle",
"highway/service/driveway",
"highway/service/alley",
"highway/service/emergency_access",
"highway/service/drive-through"
]
}
+5 -2
View File
@@ -1,15 +1,18 @@
{
"geometry": "relation",
"icon": "iD-route",
"name": "Route Features",
"icon": "route",
"members": [
"type/route/road",
"type/route/bicycle",
"type/route/foot",
"type/route/hiking",
"type/route/horse",
"type/route/piste",
"type/route/bus",
"type/route/train",
"type/route/light_rail",
"type/route/tram",
"type/route/subway",
"type/route/ferry",
"type/route/power",
"type/route/pipeline",
+10
View File
@@ -0,0 +1,10 @@
{
"icon": "iD-power-line",
"name": "Utility Features",
"members": [
"power/line",
"power/minor_line",
"man_made/pipeline",
"power/cable/underground"
]
}
-11
View File
@@ -1,11 +0,0 @@
{
"geometry": "area",
"name": "Water Features",
"icon": "water",
"members": [
"natural/water/lake",
"natural/water/pond",
"natural/water/reservoir",
"natural/water"
]
}
-12
View File
@@ -1,12 +0,0 @@
{
"geometry": "line",
"name": "Water Features",
"icon": "category-water",
"members": [
"waterway/river",
"waterway/stream",
"waterway/canal",
"waterway/ditch",
"waterway/drain"
]
}
+11
View File
@@ -0,0 +1,11 @@
{
"icon": "maki-water",
"name": "Water Bodies",
"members": [
"natural/water",
"natural/water/pond",
"natural/water/basin",
"natural/water/lake",
"natural/water/reservoir"
]
}
+14
View File
@@ -0,0 +1,14 @@
{
"icon": "iD-waterway-stream",
"name": "Waterways",
"members": [
"waterway/stream",
"waterway/drain",
"waterway/river",
"waterway/canal",
"waterway/ditch",
"natural/water/stream",
"natural/water/river",
"natural/water/canal"
]
}
+59 -49
View File
@@ -1,51 +1,61 @@
{
"area": [
"category-landuse",
"category-building",
"category-water-area",
"leisure/park",
"amenity/hospital",
"amenity/place_of_worship",
"amenity/cafe",
"amenity/restaurant",
"area"
],
"line": [
"category-road",
"category-rail",
"category-path",
"category-water-line",
"power/line",
"line"
],
"point": [
"leisure/park",
"amenity/hospital",
"amenity/place_of_worship",
"amenity/cafe",
"amenity/restaurant",
"amenity/fast_food",
"amenity/bar",
"amenity/bank",
"shop/supermarket",
"point"
],
"vertex": [
"highway/crosswalk",
"highway/crossing",
"railway/level_crossing",
"highway/traffic_signals",
"highway/turning_circle",
"highway/mini_roundabout",
"highway/motorway_junction",
"vertex"
],
"relation": [
"category-route",
"category-restriction",
"type/boundary",
"type/multipolygon",
"type/site",
"relation"
]
"area": [
"category-landuse",
"category-building",
"category-water",
"category-natural",
"leisure/park",
"amenity/hospital",
"amenity/place_of_worship",
"amenity/cafe",
"amenity/restaurant",
"area"
],
"line": [
"category-road_major",
"category-road_minor",
"category-rail",
"category-path",
"category-waterway",
"category-barrier",
"category-natural",
"category-utility",
"line"
],
"point": [
"category-natural",
"leisure/park",
"amenity/hospital",
"amenity/place_of_worship",
"amenity/cafe",
"amenity/restaurant",
"amenity/fast_food",
"amenity/bar",
"amenity/bank",
"shop/supermarket",
"point"
],
"vertex": [
"highway/crossing/marked",
"highway/crossing/unmarked",
"railway/level_crossing",
"highway/traffic_signals",
"highway/turning_circle",
"highway/turning_loop",
"traffic_calming",
"highway/mini_roundabout",
"highway/motorway_junction",
"point"
],
"relation": [
"category-route",
"category-restriction",
"public_transport/stop_area",
"type/boundary",
"type/waterway",
"type/multipolygon",
"type/enforcement",
"type/site",
"relation"
]
}
+489 -1485
View File
File diff suppressed because it is too large Load Diff
+11 -7
View File
@@ -15,31 +15,35 @@
"options": {
"yes": {
"title": "Allowed",
"description": "Access permitted by law; a right of way"
"description": "Access allowed by law; a right of way"
},
"no": {
"title": "Prohibited",
"description": "Access not permitted to the general public"
"description": "Access not allowed to the general public"
},
"permissive": {
"title": "Permissive",
"description": "Access permitted until such time as the owner revokes the permission"
"description": "Access allowed until such time as the owner revokes the permission"
},
"private": {
"title": "Private",
"description": "Access permitted only with permission of the owner on an individual basis"
"description": "Access allowed only with permission of the owner on an individual basis"
},
"designated": {
"title": "Designated",
"description": "Access permitted according to signs or specific local laws"
"description": "Access allowed according to signs or specific local laws"
},
"destination": {
"title": "Destination",
"description": "Access permitted only to reach a destination"
"description": "Access allowed only to reach a destination"
},
"dismount": {
"title": "Dismount",
"description": "Access permitted but rider must dismount"
"description": "Access allowed but rider must dismount"
},
"permit": {
"title": "Permit",
"description": "Access allowed only with a valid permit or license"
}
}
}
+5
View File
@@ -0,0 +1,5 @@
{
"key": "access_aisle",
"type": "combo",
"label": "Type"
}
+6 -2
View File
@@ -2,6 +2,10 @@
"key": "access",
"type": "combo",
"label": "Allowed Access",
"placeholder": "yes",
"options": ["permissive", "private", "customers", "no"]
"options": ["yes", "permissive", "private", "customers", "permit", "no"],
"terms": [
"permitted",
"private",
"public"
]
}
-6
View File
@@ -1,6 +0,0 @@
{
"key": "access",
"type": "combo",
"label": "Access",
"options": ["yes", "permissive", "private", "customers"]
}
@@ -0,0 +1,13 @@
{
"key": "addr:interpolation",
"type": "combo",
"label": "Type",
"strings": {
"options": {
"all": "All",
"even": "Even",
"odd": "Odd",
"alphabetic": "Alphabetic"
}
}
}
+51 -21
View File
@@ -1,41 +1,71 @@
{
"type": "address",
"key": "addr",
"keys": [
"addr:block_number",
"addr:city",
"addr:block_number",
"addr:conscriptionnumber",
"addr:county",
"addr:country",
"addr:county",
"addr:district",
"addr:floor",
"addr:hamlet",
"addr:housename",
"addr:housenumber",
"addr:conscriptionnumber",
"addr:street",
"addr:city",
"addr:postcode",
"addr:neighbourhood",
"addr:place",
"addr:hamlet",
"addr:suburb",
"addr:subdistrict",
"addr:district",
"addr:postcode",
"addr:province",
"addr:quarter",
"addr:state",
"addr:country"
"addr:street",
"addr:subdistrict",
"addr:suburb",
"addr:unit"
],
"reference": {"key": "addr"},
"icon": "address",
"universal": true,
"label": "Address",
"strings": {
"placeholders": {
"block_number": "Block Number",
"block_number!jp": "Block No.",
"city": "City",
"city!cn": "City/Prefecture/League",
"city!jp": "City/Town/Village/Tokyo Special Ward",
"city!vn": "City/Town",
"conscriptionnumber": "123",
"country": "Country",
"county": "County",
"county!jp": "District",
"district": "District",
"district!cn": "District/County/Banner",
"district!vn": "Arrondissement/Town/District",
"floor": "Floor",
"hamlet": "Hamlet",
"housename": "Housename",
"housenumber": "123",
"conscriptionnumber": "123",
"street": "Street",
"city": "City",
"postcode": "Postcode",
"housenumber!jp": "Building No./Lot No.",
"neighbourhood": "Neighbourhood",
"neighbourhood!jp": "Chōme/Aza/Koaza",
"place": "Place",
"hamlet": "Hamlet",
"suburb": "Suburb",
"subdistrict": "Subdistrict",
"district": "District",
"postcode": "Postcode",
"province": "Province",
"province!cn": "Province/Municipality/AR/SAR",
"province!jp": "Prefecture",
"quarter": "Quarter",
"quarter!jp": "Ōaza/Machi",
"state": "State",
"country": "Country"
"street": "Street",
"subdistrict": "Subdistrict",
"subdistrict!vn": "Ward/Commune/Townlet",
"suburb": "Suburb",
"suburb!jp": "Ward",
"unit": "Unit"
}
}
},
"terms": [
"location"
]
}
+2 -1
View File
@@ -1,5 +1,6 @@
{
"key": "admin_level",
"type": "number",
"minValue": 1,
"label": "Admin Level"
}
}
+2 -1
View File
@@ -1,6 +1,7 @@
{
"key": "aerialway:capacity",
"type": "number",
"minValue": 0,
"label": "Capacity (per hour)",
"placeholder": "500, 2500, 5000..."
}
}
+2 -1
View File
@@ -1,6 +1,7 @@
{
"key": "aerialway:duration",
"type": "number",
"minValue": 0,
"label": "Duration (minutes)",
"placeholder": "1, 2, 3..."
}
}
+2 -1
View File
@@ -1,6 +1,7 @@
{
"key": "aerialway:occupancy",
"type": "number",
"minValue": 0,
"label": "Occupancy",
"placeholder": "2, 4, 8..."
}
}
+5
View File
@@ -0,0 +1,5 @@
{
"key": "agrarian",
"type": "semiCombo",
"label": "Products"
}
@@ -0,0 +1,9 @@
{
"key": "air_conditioning",
"type": "check",
"label": "Air Conditioning",
"terms": [
"cooling system",
"refrigeration"
]
}
+5
View File
@@ -0,0 +1,5 @@
{
"key": "animal_boarding",
"type": "semiCombo",
"label": "For Animals"
}
+5
View File
@@ -0,0 +1,5 @@
{
"key": "animal_breeding",
"type": "semiCombo",
"label": "For Animals"
}
+5
View File
@@ -0,0 +1,5 @@
{
"key": "animal_shelter",
"type": "semiCombo",
"label": "For Animals"
}
+8
View File
@@ -0,0 +1,8 @@
{
"key": "architect",
"type": "text",
"label": "Architect",
"terms": [
"building designer"
]
}
+5
View File
@@ -0,0 +1,5 @@
{
"key": "attraction",
"type": "typeCombo",
"label": "Type"
}
+19
View File
@@ -0,0 +1,19 @@
{
"key": "baby_feeding",
"type": "combo",
"label": "Baby Nursing Area",
"strings": {
"options": {
"room": "Dedicated Room",
"yes": "Marked Space",
"no": "None"
}
},
"terms": [
"baby feeding",
"breastfeeding",
"lactation",
"mothers",
"nursing"
]
}
+5
View File
@@ -0,0 +1,5 @@
{
"key": "baby",
"type": "check",
"label": "Baby Seat"
}
+5
View File
@@ -0,0 +1,5 @@
{
"key": "backcountry",
"type": "check",
"label": "Backcountry"
}
+5
View File
@@ -0,0 +1,5 @@
{
"key": "bar",
"type": "check",
"label": "Bar"
}
+5
View File
@@ -0,0 +1,5 @@
{
"key": "basin",
"type": "combo",
"label": "Type"
}
+5
View File
@@ -0,0 +1,5 @@
{
"key": "bath:open_air",
"label": "Open Air",
"type": "check"
}

Some files were not shown because too many files have changed in this diff Show More