这是一个简单的解决方案
由于Google无法提供关于海洋或内陆水域坐标的可靠结果,因此您需要使用其他备份服务(例如Yandex)来在缺少关键信息时提供帮助。您极有可能不想使用Yandex作为主要的地理编码器,因为Google在世界数据的可靠性和完整性方面远胜于其他人,但是,当与水体坐标有关时,Yandex对于检索数据非常有用,因此,请同时使用。
Yandex文档:https : //api.yandex.com.tr/maps/doc/geocoder/desc/concepts/input_params.xml
检索海洋名称的步骤:
1.)首先使用Google对坐标进行反向地理编码。
2.)如果Google返回零结果,则坐标位于海洋上的可能性为99%。现在,以与Yandex相同的坐标发出辅助反向地理编码请求。Yandex会传回JSON回应,并提供确切的座标,在这个回应中将包含两个重要的「键」:「值」对
["GeoObject"]["metaDataProperty"]["GeocoderMetaData"]["kind"]
and
["GeoObject"]["name"]
检查种类键,如果它==“ hydro”,则表明您位于水域之上,并且由于Google返回的结果为零,因此该水域很有可能是99.99%。海洋的名称将是上面的“名称”键。
这是我如何使用Ruby编写的此策略的示例
if result.data["GeoObject"]["metaDataProperty"]["GeocoderMetaData"]["kind"] == "hydro"
ocean = result.data["GeoObject"]["name"]
end
检索内陆水域名称的步骤:
对于此示例,假设我们的坐标位于某处的湖泊中:
1.)首先使用Google对坐标进行反向地理编码。
2.)Google很可能会返回结果,该结果是附近土地上醒目的默认地址。在此结果中,它提供了返回地址的坐标,该坐标与您提供的地址不匹配。测量您提供的坐标与返回结果的坐标之间的距离(如果该坐标有很大不同(例如100码)),请使用Yandex执行辅助备份请求,并检查“ kind”键的值(如果存在)是“水”,那么您知道坐标位于水上。由于Google返回的结果与上述示例相反,因此这是内陆水域的可能性为99.99%,因此现在您可以获取名称。如果“ kind”不==“ hydro”,则使用Google地理编码对象。
["GeoObject"]["metaDataProperty"]["GeocoderMetaData"]["kind"]
and
["GeoObject"]["name"]
这是用Ruby编写的用于获取inland_body_of_water的相同代码
if result.data["GeoObject"]["metaDataProperty"]["GeocoderMetaData"]["kind"] == "hydro"
inland_body_of_water = result.data["GeoObject"]["name"]
end
关于许可的注意事项:据我所知,Google不允许您使用其数据在Google提供的地图以外的任何其他地图上显示。但是,Yandex的许可非常灵活,您可以使用其数据在Google地图上显示。
Yandex还具有每天50,000个免费请求的高速率限制,并且没有必需的API密钥。