* Having separate presets for Surveillance and Surveillance Camera means we can show the camera related fields only if `surveillance:type=camera` * Generally use Upper Case for labels and keep it short * if list of values is really fixed, use options strings to make them translateable * if list of values is not fixed, avoid adding placeholder, iD will fetch from taginfo * Seems like value "ALPR" is preferred over "alpr"
Presets
iD editor preset and field types are defined in JSON
files located under the data/presets folder of the iD repository.
Preset Files
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 Schema
A basic preset is of the form:
{
// 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.
"fields": [
"address"
],
// 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
// lines are unclosed ways, and areas are closed ways
"geometry": [
"point", "area"
],
// Terms are synonyms for the preset - these are added to fuel
// the search functionality. searching for 'woodland' will bring
// up this 'park' preset
"terms": [
"esplanade",
"village green",
"woodland"
],
// Tags that are added to the feature when selecting the preset,
// and also used to match the preset against existing features.
// You can use the value "*" to match any value.
"tags": {
"leisure": "park"
},
// English language display name for this map feature.
"name": "Park"
}
The complete JSON schema for presets can be found in data/presets/schema/preset.json
Preset Properties
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)
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 access=* is stored in the file
data/presets/fields/access.json. Note that there are exceptions to this rule
for fields that might work differently depending on which preset is active
(access_simple.json, access_toilets.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
{
"key": "cuisine",
"type": "combo",
"label": "Cuisine"
}
The complete JSON schema for fields can be found in data/presets/schema/field.json
Field Types
Text fields
text- Basic single line text fieldnumber- 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 addressesurl- Text field for entering URLstextarea- 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
(e.g.waterway=*. If unset, tag will bewaterway=yes, but dropdown contains options likestream,ditch,river)multiCombo- Dropdown field for addingyesvalues to a common multikey
(e.g.recycling:*->recycling:glass=yes,recycling:paper=yes, etc.)networkCombo- Dropdown field that helps users pick a routenetworktag (localized for editing location)
Checkboxes
check- 3-state checkbox:yes,no, unknown (no tag)defaultcheck- 2-state checkbox where checked producesyesand unchecked produces no tag
Radio Buttons
radio- Multiple choice radio button field
Special
access- Block of dropdowns for defining theaccess=*tags on a highwayaddress- Block of text and dropdown fields for entering address information (localized for editing location)cycleway- Block of dropdowns for addingcycleway:leftandcycleway:righttags on a highwaymaxspeed- Numeric text field for speed and dropdown for "mph/kph"restrictions- Graphical field for editing turn restrictionswikipedia- Block of fields for selecting a wiki language and Wikipedia page
Field Properties
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).
{
"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.
{
"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.
{
"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.
Icons
Preset icons in iD are pulled from the open source map icon set, 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 npm run build.
The following files are autogenerated and will be replaced when rebuilding:
data/presets/categories.jsondata/presets/fields.jsondata/presets/presets.jsondata/presets.yamldata/taginfo.jsondist/locales/en.json
Custom Presets
iD supports deployments which use a custom set of presets. You can supply presets via
the presets accessor:
var id = iD.Context().presets({
presets: { ... },
fields: { ... },
defaults: { ... },
categories: { ... }
});
All four parts (presets, fields, defaults, and categories) must be supplied. In addition, several base presets and fields must be included.
Basic geometric presets must be included so that every feature matches at least one preset. For example:
"area": {
"name": "Area",
"tags": {},
"geometry": ["area"],
"matchScore": 0.1
},
"line": {
"name": "Line",
"tags": {},
"geometry": ["line"],
"matchScore": 0.1
},
"point": {
"name": "Point",
"tags": {},
"geometry": ["point"],
"matchScore": 0.1
},
"vertex": {
"name": "Other",
"tags": {},
"geometry": ["vertex"],
"matchScore": 0.1
},
"relation": {
"name": "Relation",
"tags": {},
"geometry": ["relation"],
"matchScore": 0.1
}
A "name" field must be included:
"name": {
"key": "name",
"type": "localized",
"label": "Name",
"placeholder": "Common name (if any)"
}