Leaflet + GeoJson从OSM Data - Relations转换而来

时间:2015-01-23 08:32:55

标签: javascript leaflet openstreetmap geojson

我正在尝试显示我从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
      ]]
    }
  }]
};

正如您所看到的,关系在方括号中。我希望根据关系> reltags>颜色标签显示不同颜色的轨道。这是我的主要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),但它不起作用。有什么方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:3)

这不起作用,因为feature.properties.relations是一个包含对象的数组(因此是周围的括号)。要访问存储在该数组中的对象,可以使用如下数组表示法:feature.properties.relations[0]表示数组中的第一个对象,feature.properties.relations[1]表示数组中的第二个对象,依此类推。因此,如果要访问数组中第一个关系对象中reltags对象的color属性,则应使用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。我想知道为什么你在blue的情况下返回'#FF0000',因为那是红色的代码,同样的情况是red,你要返回'#0000FF'这是蓝色的代码。除此之外,当您使用feature.properties.relations[0].reltags.colour时,代码工作正常,如我提供的示例中所示。