目的
就是想要某一批数据,并且找到其对应的边界,用作一些特殊的处理。
举例来说,之前在(Openstreetmap 从入门到放弃)[https://loveyu.org/5344.html] 中提到的,查询机场边界,用于判断自己是否在机场内的逻辑。
所需工具
- WikiData 查询工具, https://query.wikidata.org/ 用于查询查询想要数据的wikidataID
- OSM 数据查询工具, https://overpass-turbo.eu/ 用于通过对应的wikidataID,查询想要的边界数据信息,并进行格式转换
- OsmToGeojson OSM转换工具,https://github.com/tyrasd/osmtogeojson 需要nodejs支持,能够转换osm.xml格式数据为geojson数据,以便数据更加通用。
- 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 条
这样就很容易得到所需的WikiDataID,然后在通过WikiDataId进行相应的,额外查询。
OSM 边界内容查询
对于OSM数据如何获取又是一个问题, https://overpass-turbo.eu/ 工具可以简单的可视化获取数据,使用如下语句得到相关内容。
-
通过wikidataID进行数据查询
( way["wikidata"="Q223416"]; relation["wikidata"="Q223416"]; ); out body; >; out skel qt;
-
通过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
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打开对应的数据,效果如下:
当前还没有任何评论