Reverse Geocoding Is Hard
反向地理编码(Reverse Geocoding)真是太难了
Terence Eden 的博客 @edent
geolocation geotagging OpenBenches · 6 comments · 850 words · Viewed ~3,488 times.
我和我的妻子运营着 OpenBenches —— 一个众包的数据库,其中包含近 40,000 个纪念长椅。 每条长椅都使用经纬度进行了地理标记。 但是,如何将一串数字转换为人类可读的内容呢?
如何将 -33.755780,150.603769
变成 “42 Wallaby Way, Sydney, Australia”?
幸运的是,这是一个(在某种程度上)已解决的问题。 诸如 OpenCage, StadiaMaps, OpenStreetMap, 和 Geocode.Earth 之类的服务都提供 API,这些 API 将坐标转换为地址。 完成! 让我们回家。
除了… 并非所有地方都_有_地址。 有些长椅在公园里。 它们通常没有街道号码,但可能附近有一些有趣的特征可以帮助定位。 例如,雕像或著名的地标。
而且… 并非每个地址都相关。 有些长椅在街道上。 但是我们可能不想暗示长椅位于_内部_或属于特定的附近房屋。
让我们退后一步。_为什么_我们要显示人类可读的地址?
我们有两个用例。
“作为网站的访问者,我想要:”
- 阅读长椅位置的(大致)文本表示。
- 单击地址的组成部分以查看该区域内的所有长椅。
第一个很容易解释:
第二个比较难。 假设一个长椅在 Wellington, New Zealand。 我们要创建一个像 openbenches.org/location/New Zealand/Wellington/ 这样的 URL。 这样,用户可以单击“Wellington”一词并找到附近的所有长椅。 用户还可以手动编辑该 URL 以提高或降低精度。
这两个都是_精度_问题。
让我们看一下其中一个反向地理编码服务如何处理将 51.476845,-0.295296
转换为地址:
Royal Botanic Gardens, Kew, Sandycombe Road, Kew, London Borough of Richmond upon Thames, London, Greater London, England, TW9 2EN, United Kingdom
这个地址_太多_了!
是的,从技术上讲是准确的。 但是它包含太多人类不需要的细节,邮政编码无关紧要,而且奇怪的细分是当地人不会使用的东西。
查看完整的 API 响应,我们可以看到:
 JSON{
"place_id": 258770727,
"licence": "Data © OpenStreetMap contributors, ODbL 1.0. http://osm.org/copyright",
"name": "Royal Botanic Gardens, Kew",
"display_name": "Royal Botanic Gardens, Kew, Elizabeth Cottages, Kew, London Borough of Richmond upon Thames, London, Greater London, England, TW9 3NJ, United Kingdom",
"address": {
"leisure": "Royal Botanic Gardens, Kew",
"road": "Elizabeth Cottages",
"suburb": "Kew",
"city_district": "London Borough of Richmond upon Thames",
"ISO3166-2-lvl8": "GB-RIC",
"city": "London",
"state_district": "Greater London",
"state": "England",
"ISO3166-2-lvl4": "GB-ENG",
"postcode": "TW9 3NJ",
"country": "United Kingdom",
"country_code": "gb"
}
}
啊哈! 也许我可以使用这些组件构建一个更好的地址!
除了… 并非每个国家/地区都有州。 并非所有州都在给出地址时使用。 并非每个位置都在城市中。 有些地方有村庄,县,市和村庄。
New York, New York 是一个有效的地址,但是 Berlin, Berlin 不是!
OpenCage 有一个地址格式化程序,对于剥离无关紧要的细节非常明智。 但是,回到我的第一点,并非 OpenBenches 上的每个地图位置都是街道地址,即使它在街道上,也可能不应该有房屋号码。
好吧,有一种解决方案! 大多数地图提供商都有 POI 功能 —— 我们可以找到附近的感兴趣的事物并将其用作位置。
这是美国伊利诺伊州库克县的长椅。 POI 地址为:
 JSON{
…
"name": "Central Park",
"coarse_location": "Des Plaines, IL, USA",
…
}
我_假设_在 Des Plaines 中只有一个 Central Park。 人们是否知道 “Il” 是 Illinois? “Cook County” 会有用吗?
关于本地化,并非所有地方都说英语。 我要显示 “原爆の子の像, 広島, 日本” 这样的地址吗? “原爆の子の像, Hiroshima, Japan”怎么样?
我们是一个国际站点,但是大多数长椅都在英语国家。
当然,仅仅因为某些东西_物理上_靠近 POI,并不意味着它_在逻辑上_靠近它。
考虑一下位于此公园边缘的长椅
最近的 POI 是 “Gay's Creamery” —— 在河对面。 这是您期望的吗? 有没有一种简单的方法可以说“如果一个点位于_内部_ amenity*,则将其用作地址?
我不希望我们网站的用户必须从 POI 或地址列表中进行选择,这应该尽可能自动化。
计划
对于每个长椅:
- 使用 StadiaMaps 获取最近的 POI。
- 以英语获取数据。
- 连接名称和粗略位置。
- 保存 “address”。
- 等待投诉?
有什么想法吗?
在以下网站上分享此帖子…
-
-
-
-
-
-
-
-
- [ ![WhatsApp](data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20aria-label%3D%22WhatsApp%22%20role%3D%22img%22%20viewBox%3D%220%200%20512%20512%22%3E%3Cpath%20d%3D%22m0%200H512V512H0%22%20fill%3D%22%2325d366%22%2F%3E%3Cpath%20fill%3D%22%23fff%22%20d%3D%22m79%20434%2025.7-93.9a181.1%20181.2%200%201170.3%2068.7M122.5%20391l57-15a150.6%20150.6%200%2010-41.8-40.6m93