Leaflet + GeoJson 从 OSM 数据转换而来 - 关系
Leaflet + GeoJson converted from OSM Data - Relations
我正在尝试显示我从 geofabrik 下载、使用 osmconvert 转换、使用 osmfilter 过滤并转换为 geojson 的自行车关系。目前 Leaflet 在地图上正确显示线串和节点。问题在于文件中包含的关系数据。这是我的 GeoJson 文件的一部分(我不会包含整个文件,因为它太大了):
var rower = {
"type": "FeatureCollection",
"features": [{
"type": "Feature",
"id": "way/27149688",
"properties": {
"type": "way",
"id": "27149688",
"tags": {
"agricultural": "no",
"bicycle": "yes",
"highway": "residential",
"maxweightrating:hgv": "24",
"maxweightrating:hgv:condtitional": "none @ marked",
"name": "Mikołaja Reja",
"source:maxweightrating:hgv": "PL:sign_B-5-note"
},
"relations": [{
"role": "",
"rel": "4046118",
"reltags": {
"colour": "blue",
"description": "Leśna trasa rowerowa, preferowany rower górski / Forest track, Mountain Bike preferred",
"lcn_ref": "niebieski",
"name": "Szlak Trójmiejski",
"network": "rcn",
"route": "bicycle",
"type": "route"
}
}],
"meta": {
"timestamp": "2014-04-17T11:58:45Z",
"version": "20",
"changeset": "21747999",
"user": "wojtas82",
"uid": "729745"
},
"tainted": true
},
"geometry": {
"type": "LineString",
"coordinates": [[
18.5024141,
54.4354139
],[
18.503622,
54.4353485
],[
18.5053714,
54.4352858
]]
}
}]
};
如您所见,关系在方括号中。我希望根据 relations>reltags>colour tag 显示不同颜色的曲目。这是我的主要 html 文件(实际上是不起作用的一方):
var rower2 = L.geoJson(rower, {
style: function (feature) {
switch (feature.properties.relations) {
case 'blue':
return {color: "#ff0000"};
case 'red':
return {color: "#0000ff"};
}
}
}).addTo(map);
我试图将这部分 (feature.properties.relations) 修改为 (feature.properties.relations.reltags.colour) 但它不起作用。有什么办法可以解决这个问题吗?
这不起作用,因为 feature.properties.relations
是一个包含对象的数组(因此周围的括号)。要访问存储在该数组中的对象,您可以使用这样的数组表示法:feature.properties.relations[0]
表示数组中的第一个对象,feature.properties.relations[1]
表示数组中的第二个对象,依此类推。因此,如果您想访问数组中第一个关系对象中 reltags 对象的颜色 属性,您应该使用 feature.properties.relations[0].reltags.colour
var rower2 = L.geoJson(rower, {
style: function (feature) {
switch (feature.properties.relations[0].reltags.colour) {
case 'blue':
return {color: "#ff0000"};
case 'red':
return {color: "#0000ff"};
}
}
}).addTo(map);
但我猜你会 运行 惹上麻烦,因为 OSM 确实使用数组来处理有目的的关系。我的猜测是一个特征可以有多种关系,因此它可以有多种颜色。
这是一个关于 Plunker 的工作示例:http://plnkr.co/edit/EjCCsb?p=preview
PS。我想知道为什么当 case 是 blue
时你返回 '#FF0000' 因为那是红色的代码,与 case red
一样,你返回 '#0000FF' 这是蓝色的代码。除此之外,当您使用 feature.properties.relations[0].reltags.colour
时代码工作正常,如您在我提供的示例中所见。
我正在尝试显示我从 geofabrik 下载、使用 osmconvert 转换、使用 osmfilter 过滤并转换为 geojson 的自行车关系。目前 Leaflet 在地图上正确显示线串和节点。问题在于文件中包含的关系数据。这是我的 GeoJson 文件的一部分(我不会包含整个文件,因为它太大了):
var rower = {
"type": "FeatureCollection",
"features": [{
"type": "Feature",
"id": "way/27149688",
"properties": {
"type": "way",
"id": "27149688",
"tags": {
"agricultural": "no",
"bicycle": "yes",
"highway": "residential",
"maxweightrating:hgv": "24",
"maxweightrating:hgv:condtitional": "none @ marked",
"name": "Mikołaja Reja",
"source:maxweightrating:hgv": "PL:sign_B-5-note"
},
"relations": [{
"role": "",
"rel": "4046118",
"reltags": {
"colour": "blue",
"description": "Leśna trasa rowerowa, preferowany rower górski / Forest track, Mountain Bike preferred",
"lcn_ref": "niebieski",
"name": "Szlak Trójmiejski",
"network": "rcn",
"route": "bicycle",
"type": "route"
}
}],
"meta": {
"timestamp": "2014-04-17T11:58:45Z",
"version": "20",
"changeset": "21747999",
"user": "wojtas82",
"uid": "729745"
},
"tainted": true
},
"geometry": {
"type": "LineString",
"coordinates": [[
18.5024141,
54.4354139
],[
18.503622,
54.4353485
],[
18.5053714,
54.4352858
]]
}
}]
};
如您所见,关系在方括号中。我希望根据 relations>reltags>colour tag 显示不同颜色的曲目。这是我的主要 html 文件(实际上是不起作用的一方):
var rower2 = L.geoJson(rower, {
style: function (feature) {
switch (feature.properties.relations) {
case 'blue':
return {color: "#ff0000"};
case 'red':
return {color: "#0000ff"};
}
}
}).addTo(map);
我试图将这部分 (feature.properties.relations) 修改为 (feature.properties.relations.reltags.colour) 但它不起作用。有什么办法可以解决这个问题吗?
这不起作用,因为 feature.properties.relations
是一个包含对象的数组(因此周围的括号)。要访问存储在该数组中的对象,您可以使用这样的数组表示法:feature.properties.relations[0]
表示数组中的第一个对象,feature.properties.relations[1]
表示数组中的第二个对象,依此类推。因此,如果您想访问数组中第一个关系对象中 reltags 对象的颜色 属性,您应该使用 feature.properties.relations[0].reltags.colour
var rower2 = L.geoJson(rower, {
style: function (feature) {
switch (feature.properties.relations[0].reltags.colour) {
case 'blue':
return {color: "#ff0000"};
case 'red':
return {color: "#0000ff"};
}
}
}).addTo(map);
但我猜你会 运行 惹上麻烦,因为 OSM 确实使用数组来处理有目的的关系。我的猜测是一个特征可以有多种关系,因此它可以有多种颜色。
这是一个关于 Plunker 的工作示例:http://plnkr.co/edit/EjCCsb?p=preview
PS。我想知道为什么当 case 是 blue
时你返回 '#FF0000' 因为那是红色的代码,与 case red
一样,你返回 '#0000FF' 这是蓝色的代码。除此之外,当您使用 feature.properties.relations[0].reltags.colour
时代码工作正常,如您在我提供的示例中所见。