如何从WikiData查询数据,然后再OSM中查询边界

目的

就是想要某一批数据,并且找到其对应的边界,用作一些特殊的处理。

举例来说,之前在(Openstreetmap 从入门到放弃)[http://www.loveyu.org/5344.html] 中提到的,查询机场边界,用于判断自己是否在机场内的逻辑。

所需工具

  1. WikiData 查询工具, https://query.wikidata.org/ 用于查询查询想要数据的wikidataID
  2. OSM 数据查询工具, https://overpass-turbo.eu/ 用于通过对应的wikidataID,查询想要的边界数据信息,并进行格式转换
  3. OsmToGeojson OSM转换工具,https://github.com/tyrasd/osmtogeojson 需要nodejs支持,能够转换osm.xml格式数据为geojson数据,以便数据更加通用。
  4. http://geojson.io/ geojson的显示工具边界及相关数据

具体实现

Wikidata 查询

查询方法为一个特别不熟悉的SPARQL语句,只能照葫芦画瓢,弄了一个查询条件,并且得到了正确的结果。

SELECT ?item ?IATA ?itemLabel WHERE {
  SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }

  OPTIONAL { ?item wdt:P238 ?IATA. }
    OPTIONAL { ?item wdt:P238  ?itemLabel.  }
} limit 100

或另外一种查询方案

SELECT ?s ?IATA ?itemLabel WHERE {
    ?s wdt:P31 wd:Q644371 .
    OPTIONAL {
        ?s  wdt:P238 ?IATA.
        ?s rdfs:label ?itemLabel filter (lang(?itemLabel) = "zh-cn").
    }
}

以上的查询方式回得类似如下的结果,共计 8659 条

WikiData Query 结果

这样就很容易得到所需的WikiDataID,然后在通过WikiDataId进行相应的,额外查询。

OSM 边界内容查询

对于OSM数据如何获取又是一个问题, https://overpass-turbo.eu/ 工具可以简单的可视化获取数据,使用如下语句得到相关内容。

  1. 通过wikidataID进行数据查询

    (
     way["wikidata"="Q223416"];
     relation["wikidata"="Q223416"];
    );
    out body;
    >;
    out skel qt;
  2. 通过iata进行查询,所以查询的方式永远不止只有一种,得到数据的方式也有很多

    (
     way["iata"="KHH"];
     relation["iata"="KHH"];
    );
    out body;
    >;
    out skel qt;

上面的语句能查询到相应的机场数据,当然这种方式并不能查询到全部数据,永远只有部分,部分是指数据并未去关联,正如上面的内容,查询可以得到xml格式的数据,同样可以查询得到json的数据,只是内容为OSM,并非geojson。就看使用目的了,正对部分场景需要进行再次转换。

OSM 数据转换

首先安装osmtogeojson, 能够进行转换的工具永远不止一个,如果可以自己写一个也是一定可行的。

npm install -g osmtogeojson
curl -o osm.xml "http://overpass-api.de/api/interpreter?data=%28%0A%20%20way%5B%22iata%22%3D%22KHH%22%5D%3B%0A%20%20relation%5B%22iata%22%3D%22KHH%22%5D%3B%0A%29%3B%0Aout%20body%3B%0A%3E%3B%0Aout%20skel%20qt%3B"
osmtogeojson osm.xml > osm.geojson

最终会得到文件 osm.geojson ,如果偷懒完全可以在geojson.io打开对应的数据,效果如下:

高雄机场地图边界的显示

当前还没有任何评论

写下你最简单的想法