我正在使用Google Refine按照这篇精彩帖子https://opensas.wordpress.com/2013/06/30/using-openrefine-to-geocode-your-data-using-google-and-openstreetmap-api/中的建议,将地址与对Nominatim API的请求进行地理编码。
一切正常:这里有两个样品......
http://open.mapquestapi.com/nominatim/v1/search.php?format=json&q=Via%20Pietro%20Paleocapa%2073,Alzano%20Lombardo,Italia
产生
[{"place_id":"55017260","licence":"Data \u00a9 OpenStreetMap contributors, ODbL 1.0. http:\/\/www.openstreetmap.org\/copyright","osm_type":"way","osm_id":"22565087","boundingbox":["45.7324335","45.736092","9.7222512","9.7235157"],"lat":"45.7343899","lon":"9.7231855","display_name":"Via Pietro Paleocapa, Alzano Lombardo, BG, Lombardy, 24027, Italy","class":"highway","type":"unclassified","importance":0.6}]
和
http://open.mapquestapi.com/nominatim/v1/search.php?format=json&q=Via%20Cernaia%2020,%20Torino%20,%20Italia
产生
[{"place_id":"24085209","licence":"Data \u00a9 OpenStreetMap contributors, ODbL 1.0. http:\/\/www.openstreetmap.org\/copyright","osm_type":"node","osm_id":"2334729647","boundingbox":["45.0715728","45.0715728","7.6742348","7.6742348"],"lat":"45.0715728","lon":"7.6742348","display_name":"20, Via Cernaia, Quadrilatero Romano, Circoscrizione 1, Turin, TO, Piemont, 10122, Italy","class":"place","type":"house","importance":0.201}]
差异在于第一个响应具有" osm_type":#34;方式"类型和第二个有一个" osm_type":"节点"类型。
我只对#os; osm_type":" node"的回复感兴趣,对于这些我想提取lat和lon值。
我不知道如何在Google Refine中使用GREL提取它们.....有什么建议吗?
如果可能有用,我也可以在XML中获得回复...在这里您要求
http://open.mapquestapi.com/nominatim/v1/search.php?format=json&q=Via%20Pietro%20Paleocapa%2073,Alzano%20Lombardo,Italia&format=xml
http://open.mapquestapi.com/nominatim/v1/search.php?format=json&q=Via%20Cernaia%2020,%20Torino%20,%20Italia&format=xml
答案 0 :(得分:3)
您可以通过多种方式解决此问题,但基本步骤是提取osm_type。鉴于你在这里发布的JSON,GREL将是:
value.parseJson()[0].osm_type
一种方法是根据此值创建列,然后使用Facet过滤到此新列中的值为“node”的那些列。
或者,您可以使用“if”组合单个GREL语句中的步骤:
if(value.parseJson()[0].osm_type=="node",value.parseJson()[0].lat,"")
如果osm_type等于'node',则提取纬度,否则将空字符串放入单元格中。
答案 1 :(得分:1)
稍微调整欧文的公式可以消除一些冗余:
with(value.parseJson()[0], place, if(place.osm_type=='node',place.lat,''))
这不是一个很大的节省,但它是一种很好的技术,可以了解表达式何时变得更长,更复杂。 with
控制功能为稍后可以使用的变量赋值。