Вот простое решение
Поскольку Google не предоставляет надежных результатов в отношении координат, которые лежат на океанских или внутренних водоемах, вам необходимо использовать другую службу резервного копирования, такую как Яндекс, для предоставления этой важной информации, когда она отсутствует. Скорее всего, вы не захотите использовать Яндекс в качестве основного геокодера, потому что Google намного превосходит по надежности и полноте мировых данных, однако Яндекс может быть очень полезен для получения данных, когда они связаны с координатами над водоемами, так что используйте оба.
Яндекс Документация: https://api.yandex.com.tr/maps/doc/geocoder/desc/concepts/input_params.xml
Шаги для получения названия океана:
1.) Сначала используйте Google для обратного геокодирования координаты.
2.) Если Google возвращает нулевые результаты, вероятность того, что координата находится над океаном, составляет 99%. Теперь сделайте вторичный обратный запрос геокодирования с теми же координатами к яндексу. Яндекс вернет ответ JSON с точными координатами, в этом ответе будут две пары «ключ»: «значение» важности
["GeoObject"]["metaDataProperty"]["GeocoderMetaData"]["kind"]
and
["GeoObject"]["name"]
Проверьте добрый ключ, если он == "гидро", вы знаете, что находитесь над водоемом, и, поскольку Google вернул нулевые результаты, вероятность того, что этот водоем является океаном, составляет 99,99%. Имя океана будет указанным выше ключом «имя».
Вот пример того, как я использую эту стратегию, написанную на Ruby
if result.data["GeoObject"]["metaDataProperty"]["GeocoderMetaData"]["kind"] == "hydro"
ocean = result.data["GeoObject"]["name"]
end
Шаги для получения названия Внутреннего водного объекта:
Для этого примера предположим, что наша координата лежит где-то в озере:
1.) Сначала воспользуйтесь Google, чтобы изменить геокодирование координат.
2.) Google, скорее всего, вернет результат, который является известным адресом по умолчанию на соседней земле. В результате он предоставляет координаты адреса, который он возвратил, эта координата не будет соответствовать той, которую вы указали. Измерьте расстояние между введенной вами координатой и координатой, возвращенной с результатом, если оно существенно отличается (например, 100 ярдов), затем выполните дополнительный запрос резервного копирования с помощью Яндекса и проверьте, чтобы увидеть значение ключа «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. У Яндекса, однако, очень гибкое лицензирование, и вы можете использовать их данные для отображения на картах Google.
Кроме того, у Яндекса есть высокий лимит скорости 50 000 запросов / день бесплатно и без обязательного ключа API.