Preset是iD编辑器预设的要素,Field是Preset的属性,定义文件为JSON类型,存在放在目录data/presets
中。
Presets定义文件为JSON类型,存在data/presets/presets
目录下。他们有组织的存放于基于k/v结构的目录层次中。
例如, preset的tag为leisure=park,定义文件为 data/presets/presets/leisure/park.json
一个简单的preset结构
{
// 图标.
"icon": "maki-park",
// fields中的属性默认显示在编辑器左侧的属性栏中.
// 查看fields详细文档了解什么可以写在这里.
"fields": [
"address"
],
// moreFields中的属性可以手动添加到属性栏.
// 如果属性存在默认会显示在属性栏中.
"moreFields": [
"phone",
"website"
],
// preset合法的几何类型.
// 可选类型包括 point, area, line, and vertex.
// vertexes是line中的point, 比如道路中的形状点.
// lines是不闭合的ways, areas是闭合的ways.
"geometry": [
"point", "area"
],
// Terms是preset的同义词
// 他们会被添加到检索功能.
// 查找woodland会返回park要素.
"terms": [
"esplanade",
"village green",
"woodland"
],
// 当要素被选中时Tags会被默认添加,
// 同时也用于匹配要素属于哪种类型.
// 可以使用 "*" 匹配所有类型.
"tags": {
"leisure": "park"
},
// 这个要素显示的英文名称.
"name": "Park"
}
完整的要素 JSON 定义可以参考文件 data/presets/schema/preset.json
要素的英文名称,它被发送到Transifex,以便转换成本地化语言。
此属性为必须,无默认值。
要素允许的几何类型数组,要素按顺序进行匹配。
type=multipolygon
的关系area=yes
标签。leisure=swimming_pool
中area在point之前。一个拥有"key": "value"
标签的对象必须匹配到一个要素类型。通配符"*"
可以匹配这个key的任何value。
一个对象只能匹配到一个要素类型,如果匹配到多个类型,iD会根据matchScore、匹配的标签数量、使用的通配符
找到最佳匹配结果。
此属性为必须,无默认值。
当选择这个要素时可以选择添加的标签。默认值为tags
。如果需要,这个属性通常是tags
的超集。
iD的validator会建议用户从addTags
中添加缺失的标签来匹配要素。例如,Bridge要素有如下属性:
"tags": {
"man_made": "bridge"
},
"addTags": {
"man_made": "bridge",
"layer": "1"
}
当添加一个Bridge要素,会默认给出man_made=bridge
和layer=1
标签,用户可以将layer
改为3
,要素仍然匹配,因为仍然拥有man_made=bridge
标签。如果用户删除了layer
标签,iD会建议添加回值1
。
当要素变为其他类型时被删除的属性。默认值为addTags
,如果没有定义,默认值则为tags
。
这两个属性都是属性路径的数组(例如:description 或者 generator/type),fields默认显示,moreFields在用户手动添加时显示或者有匹配的标签时显示。注意,一些属性的显示有先决条件prerequisiteTag
才会显示。
一个要素可以通过中括号引用另一个要素的属性,就像{preset},例如shop/books
引用了shop
的属性:
"fields": [
"{shop}",
"internet_access"
],
"moreFields": [
"{shop}",
"internet_access/fee",
"internet_access/ssid"
],
"tags": {
"shop": "books"
}
如果fields
和moreFields
没有定义,则使用父要素的值。例如,shop/cooonvenience
自动使用shop
相同的属性。
在显式继承和隐式继承中,有属性定义的要素通常不会继承父要素属性。
本地SVG文件名称。你可以使用下面任何一组图标。使用图标时使用前缀版本名称,例如"icon": "maki-park"
或者"icon": "tnp-2009223"
。
iD-
)maki-
),Mapbox地图图标temaki-
),一个maki的扩展包
fas-
)far-
)fab-
)tnp-
),上百万的常用图标。
the_noun_project.auth
到iD的本地根目录,包含你的认证信息,例如{"consumer_key": "xxxxxx", "consumer_secret": "xxxxxx"}
。此文件不受版本控制。远程图片文件URL。并不能完全替换图标,两个图标都可能显示在用户界面中。
例如,imageURL用于从name-suggestion-index中指定品牌预设的logo。
图像至少为100100px以便在高分辨率屏幕上显示5050pt。
不推荐使用或者通用的要素可设置为"searchable": false
,这意味着在编辑现有数据时会使用他们,但在添加新要素时不能作为选项使用。
按照惯例,不可搜索的要素文件名以下划线开头。(例如,data/presets/presets/landuse/_farm.json
)
一个要素匹配的排序数字。
例如,一个要素有amenity=cafe
和building=commercial
标签,会匹配Cafe要素而不是Commercial Building要素,因为Commercial Building的matchSorce
比较低。
默认值为1.0。
一个两个字母字符数组,小写城市代码(ISO 3166-1 alpha-2
)。要素只有当用户在编辑指定的白名单国家时才能被搜索。不是用户位置或者语言设置,而是编辑的地图位置。
默认所有位置都可编辑
一个两个字母字符数组,小写城市代码(ISO 3166-1 alpha-2
)。与countryCodes
类似的黑名单。
一个更推荐的要素ID。iD验证器会与此要素设置匹配,推荐用户升级标签。
如果可能,请使用deprecated.json来指定旧标记的升级路径。此属性用于特殊情况,例如具有几何要求的升级。
一个链接到wiki文档的要素的键值。只要要素包含多个标签时才需要。
例如:
"reference": {
"key": "tower:type",
"value": "communication"
}
Fields是可以在要素中复用的元素。
Fields定义文件为JSON类型,存在data/presets/fields
目录下。
field文件通常根据关联的key命名。例如,标签sport=*
存放在文件data/presets/fields/sport.json
中。当一个属性有多个版本时,我们在文件名中添加一个后缀:(sport.json, sport_ice.json, sport_racing_moter.json
)。
某些key使用冒号(’:’)命名。命名的属性根据其标签嵌套在文件夹中。例如,标签piste:difficulty=*
存放在文件data/presets/fields/piste/difficulty.json
中。
{
"key": "cuisine",
"type": "combo",
"label": "Cuisine"
}
完整的属性 JSON 定义可以参考文件 data/presets/schema/field.json
指定属性的界面和行为的字符串。必须是以下值之一。
width=*
)name=*, name:es=*, etc.
)gnis:feature_id
)description=*
)surface=*
)waterway=*
,如果未设置,则标记将为waterway=yes
,但下拉列表中包含stream
、ditch
、river
等选项)yes
值的下拉框(例如recycling:*
-> recycling:glass=yes
,recycling:paper=yes
,etc)sport=*
-> soccer;lacrosse;athletics;field_hockey
)yes
, no
, no tag
yes
,未选中为no tag
oneway
属性。带有方向转换按钮。access=*
的标签cycleway:left
和cycleway:right
标签的下拉框将要编辑的属性的属性名称。像address这样的复合属性在keys属性中需要一个key数组。
如果属性定义中包含"universal": true
,则这个属性出现在所有要素的添加属性列表中。
如果指定,则仅显示此类几何。point
, vertex
, line
, area
。
属性的默认值。例如,building_area.json
会自动添加属性building=yes
到当前选择的building要素(仅当要素为闭合区域)
{
"key": "building",
"type": "combo",
"default": "yes",
"geometry": "area",
"label": "Building"
}
Combo类型属性可以通过options
数组提供下拉框值域。用户可以从下拉框选择也可以自己输入。
{
"key": "diaper",
"type": "combo",
"label": "Diaper Changing Available",
"options": ["yes", "no", "room", "1", "2", "3", "4", "5"]
}
Combo类型属性可以在string
属性使用name-value对。当属性有固定数量的选项,并且你想提供翻译描述时,这将非常有用。使用string
属性时,用户不能输入自己的值,必须从选项中选择。
{
"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"
}
}
}
如果Combo属性没有指定options
或者strings
,该属性将从Taginfo服务获取公共标签值用作下拉框。
用于Combo属性,如果snake_case
为true
则标签中的空格
替换为下划线
。
默认值为true
用于Combo属性,如果caseSensitive
为true
,则允许大小写敏感。
默认值为false
用于number属性,最小有效值。
无默认值
用于number属性,最大有效值。
无默认值
先决条件标签。一些标签达到先决条件才会显示。
应包含如下属性:
internet_access
属性不是no
的时候,显示Internet Access Fee
属性。"prerequisiteTag": {
"key": "internet_access",
"valueNot": "no"
}
如果某个要素具有此属性的一个或多个key的值,则无论prerequisiteTag属性如何,都将显示属性。
一个两个字母字符数组,小写城市代码(ISO 3166-1 alpha-2
)。属性只有当用户在编辑指定的白名单国家时才能被使用。不是用户位置或者语言设置,而是编辑的地图位置。
默认所有位置都可使用
一个两个字母字符数组,小写城市代码(ISO 3166-1 alpha-2
)。与countryCodes
类似的黑名单。
用于identifier
属性,外部记录的永久链接URL。必须包含一个{value}
占位符用于替换标签值。
用于identifier
属性,正则表达式匹配有效值。
编译presets,只需要执行npm run build
。
下列文件将自动生成,重新编译时被替换:
iD支持部署自定义preset集合,你可以通过preset访问器提供presets。
var id = iD.coreContext().presets({
presets: { ... },
fields: { ... },
defaults: { ... },
categories: { ... }
});
必须提供所有四个部分(presets、fields、defaults和categories)。此外,必须包括几个基本presets和fields。
必须包含基本的几何,以便每个要素至少能匹配到一个preset,例如:
"area": {
"name": "Area",
"tags": {},
"geometry": ["area"],
"matchScore": 0.1
},
"line": {
"name": "Line",
"tags": {},
"geometry": ["line"],
"matchScore": 0.1
},
"point": {
"name": "Point",
"tags": {},
"geometry": ["point", "vertex"],
"matchScore": 0.1
},
"relation": {
"name": "Relation",
"tags": {},
"geometry": ["relation"],
"matchScore": 0.1
}
必须包含一个name
属性:
"name": {
"key": "name",
"type": "localized",
"label": "Name",
"placeholder": "Common name (if any)"
}