..и тогда гугл-карты «отделяют воду от воды»
Ну, не в библейском смысле, но ..
Я хотел бы знать, какие у меня есть варианты, чтобы проверить, является ли точка [Lat, Lon] сушей или водой.
Очевидно, что в Google Maps есть эти данные (водоемы синие), но есть ли в API что-то, что я могу использовать для этого? А если нет - разве они не обслуживают его, потому что никогда об этом не думали? Или потому что это слишком сложно?
Я не нашел никакой информации по этому поводу - кроме некоторых подобных вопросов здесь (например, определение типа местности или высоты - но это не совсем то, что мне нужно).
Есть ли для этого отдельный слой? Опция? Команда? Или мне следует сделать это вручную?
Единственный способ, которым я могу придумать, как подойти к этому (если мне нужно сделать это вручную), - это проверить каждую обслуживаемую плитку на предмет точной точки, а затем проверить значение RGB для этого оттенка карты Google. Это только в теории - потому что на практике - я понятия не имею, как это сделать, первое препятствие состоит в том, что я не знаю, как я могу преобразовать местоположение пикселя на плитке, например, в точку [LatLon].
Готовое решение было бы намного проще.
Обратите внимание, что мне не нужна ВСЯ вода в мире (например - меня не интересуют ручьи, небольшие пруды, большинство рек или бассейн вашего соседа. Мне нужны точки, где человек может рискнуть без помощи плавающего транспортного средства )
ИЗМЕНИТЬ I
После прочтения комментариев: метод высоты ненадежен, слишком много мест НИЖЕ уровня моря (вы можете увидеть список 10 самых глубоких мест здесь http://geology.com/below-sea-level/ ) и там слишком много не имеющих выхода к морю водоемов НАД уровнем моря (озер). Метод обратной геолокации ненадежен, потому что он вернет геополитическую сущность, например, город или штат - или НОЛЬ много раз. Я уже изучал эти псевдорешения, прежде чем задавать вопрос - но ни одно из них на самом деле не ответило на вопрос - эти методы в лучшем случае плохо «угадывают».
источник
Ответы:
Это 2 разных способа, вы можете попробовать:
Вы можете использовать обратное геокодирование карт Google . В наборе результатов вы можете определить, вода ли это, проверив
types
. В случае воды типnatural_feature
. См. Дополнительную информацию по этой ссылке http://code.google.com/apis/maps/documentation/geocoding/#Types .Также вам необходимо проверить названия объектов, если они содержат
Sea, Lake, Ocean
и некоторые другие слова, относящиеся к воде, для большей точности. Например, пустыни тоже естьnatural_feature
.Плюсы - Весь процесс обнаружения будет выполняться на машине клиента. Нет необходимости создавать собственный серверный сервис.
Минусы - Очень неточно, и шансы на то, что вы не получите ничего на воде, очень высоки.
Вы можете определять воды / земли по пикселям с помощью статических карт Google . Но для этого вам нужно создать http-сервис.
Вот шаги, которые должна выполнить ваша служба:
latitude
,longitude
иcurrent zoom
от клиента.http://maps.googleapis.com/maps/api/staticmap?center={
широты и,
долготы}&zoom={
} & size = 1x1 & maptype = roadmap & sensor = false запрос в сервис Google Static Map.Вы не можете определить цвет пикселя на стороне клиента. Да, вы можете загрузить статическое изображение на клиентский компьютер и нарисовать изображение на
canvas
элементе. Но вы не можете использоватьgetImageData
контекст холста для получения цвета пикселя. Это ограничено междоменной политикой.Prons - высокоточное обнаружение
Минусы - Использование собственных ресурсов сервера для обнаружения
источник
Это кажется невозможным ни с одним текущим сервисом Google.
Но есть и другие службы, например, служба запросов Koordinates Vector JSON ! Вы просто запрашиваете данные в URL-адресе и получаете ответ JSON / XML .
Вы должны зарегистрироваться и указать свой ключ и выбранный номер слоя. Вы можете искать все доступные слои в их репозитории . Большинство слоев являются только региональными, но вы можете найти и глобальные, например Мировое побережье :
Когда вы выбираете слой, вы нажимаете на вкладку «Services», вы получаете URL-адрес запроса примера. Я считаю, что вам просто нужно зарегистрироваться и все!
А теперь самое лучшее:
Вы можете загрузить свой слой!
Сразу не доступно, надо как-то обработать, а должно работать! Репозиторий слоев на самом деле выглядит так, как будто люди загружали их по мере необходимости.
источник
Это то, что я использую, и он работает неплохо ... вы можете улучшить тест, если у вас есть больше процессора, который нужно тратить, добавив пикселей.
источник
Существует бесплатный веб-API, который решает именно эту проблему, под названием onwater.io . Это не что-то встроенное в карты Google, но с учетом широты и долготы он точно вернет true или false через запрос на получение.
Пример на воде: https://api.onwater.io/api/v1/results/23.92323,-66.3
Пример на суше: https://api.onwater.io/api/v1/results/42.35,-71.1
Полное раскрытие информации Я работаю в Dockwa.com , компании, стоящей за onwater. Мы построили onwater, чтобы сами решить эту проблему и помочь сообществу. Его можно использовать бесплатно (платно за большой объем), и мы хотели поделиться :)
источник
Я думал, что было бы интереснее выполнить этот запрос локально, поэтому я могу быть более самостоятельным: скажем, я хочу сгенерировать 25000 случайных координат земли за один раз, я бы предпочел избежать вызовов, возможно, дорогостоящих внешних API. Вот моя попытка сделать это на python, используя пример python , упомянутый TomSchober. В основном он ищет координаты в заранее созданном файле размером 350 МБ, содержащем все координаты суши, и, если координаты там существуют, печатает их.
Перепробовал с десяток координат, работает замечательно. Файл "land_polygons.shp" можно скачать здесь , комплимент OpenStreetMaps. (Я сам использовал первую ссылку для скачивания WGS84, может быть, вторая тоже работает)
источник
natural=coastline
. Быстрый поиск в Google дает возможность использовать эту страницу, на которой конкретно указано, что теги береговой линии фактически не применяются к озерам в их номенклатуре. Поэтому я бы сказал, что нет , мой метод не определяет озера как воду, поскольку набор данных, который я использую, не определяет. Но попробуйте сами!Ознакомьтесь с этой статьей . Он точно определяет, есть ли что-то на воде, без использования сервера. Это хитрость, основанная на функции пользовательского стиля в Google Maps.
источник
В дополнение к обратному геокодированию - как указал доктор Молл , оно может возвращать ZERO_RESULTS - вы можете использовать службу Elevation. Если обратное геокодирование дает нулевые результаты, получите высоту местоположения. Как правило, море получает отрицательное число, поскольку морское дно находится ниже уровня моря. Есть полностью проработанный пример службы подъема.
Имейте в виду, что, поскольку Google не предоставляет эту информацию, любой другой метод является всего лишь предположением, а предположения по своей сути неточны. Однако использование
type
возвращенного обратным геокодированием или отметки, еслиtype
она недоступна, покроет большинство случаев.источник
Этот метод совершенно ненадежен. Фактически, возвращаемые данные будут полностью зависеть от того, с какой частью мира вы работаете. Например, я работаю во Франции. Если я нажму на море на побережье Франции, Google вернет ближайшее местоположение ЗЕМЛИ, о котором он может «угадать». Когда я запросил информацию у Google по этому же вопросу, они ответили, что не могут точно вернуть запрошенную точку на водной массе.
Я знаю, что это не очень удовлетворительный ответ. Это довольно неприятно, особенно для тех из нас, кто предоставляет пользователю возможность щелкнуть по карте, чтобы определить положение маркера.
источник
Если все остальное не помогает, вы всегда можете попробовать проверить высоту в точке и на некотором расстоянии - не многие вещи, кроме воды, как правило, полностью плоские.
источник
К сожалению, этого ответа нет в Google Maps API, и указанный ресурс не является бесплатным, но есть веб-сервис, предоставляемый DynamicGeometry, который предоставляет операцию,
GetWaterOrLand
которая принимает пару широта / долгота ( вы можете увидеть демонстрацию здесь ).Я понимаю, как это реализовано, с помощью файлов формы водного тела. Как именно эти шейп-файлы используются с API Карт Google, но вы можете получить некоторое представление о связанной демонстрации.
Надеюсь, что это каким-то образом поможет.
источник
Вот еще один пример на чистом JavaScript: http://jsfiddle.net/eUwMf/
Как видите, идея в основном такая же, как и у rebe100x, получение изображения из API статической карты Google и чтение первого пикселя:
источник
См. Ответ, который я дал на аналогичный вопрос - он использует "HIT_TEST_TERRAIN" из API Земли для достижения этой функции.
Вот рабочий пример идеи, которую я собрал здесь: http://www.msa.mmu.ac.uk/~fraser/ge/coord/
источник
Я бы порекомендовал прокатить здесь свой собственный. Вы можете использовать такие инструменты, как GDAL, для запроса содержимого под точкой в шейп-файле. Вы можете получить шейп-файлы по географии США из многих источников, включая Бюро переписи населения США .
Это можно сделать через двоичные файлы GDAL, исходный код C или через swig в Java, Python и т. Д.
Карты переписи
Информация о GDAL
Пример точечного запроса в Python
источник
Вот простое решение
Поскольку Google не предоставляет надежных результатов в отношении координат океана или внутренних водоемов, вам необходимо использовать другую службу резервного копирования, например Яндекс, чтобы помочь предоставить эту важную информацию, когда она отсутствует. Скорее всего, вы не захотите использовать Яндекс в качестве основного геокодера, потому что Google намного превосходит по надежности и полноте мировых данных, однако Яндекс может быть очень полезен для получения данных, когда они относятся к координатам над водоемами, так что используйте оба.
Документация Яндекса: https://api.yandex.com.tr/maps/doc/geocoder/desc/concepts/input_params.xml
Шаги, чтобы получить название океана:
1.) Сначала используйте Google для обратного геокодирования координаты.
2.) Если Google возвращает нулевой результат, то с вероятностью 99% координата находится над океаном. Теперь сделайте вторичный запрос обратного геокодирования с теми же координатами в Яндекс. Яндекс вернет ответ JSON с точными координатами, в этом ответе будут две пары важности «ключ»: «значение».
Отметьте добрый ключ, если он == "hydro", вы знаете, что находитесь над водоемом, и поскольку Google дал нулевые результаты, с вероятностью 99,99% этот водоем является океаном. Название океана будет указанным выше ключом "name".
Вот пример того, как я использую эту стратегию, написанную на Ruby.
Шаги для получения названия внутреннего водоема:
В этом примере предположим, что наша координата находится где-то в озере:
1.) Сначала используйте Google для обратного геокодирования координаты.
2.) Google, скорее всего, вернет результат, который является заметным адресом по умолчанию на земле поблизости. В этом результате он предоставляет координаты возвращенного адреса, эта координата не будет соответствовать той, которую вы указали. Измерьте расстояние между предоставленной вами координатой и координатой, возвращенной с результатом, если она значительно отличается (например, 100 ярдов), затем выполните вторичный запрос резервного копирования с Яндексом и проверьте, чтобы увидеть значение ключа "kind", если он "гидро", то вы знаете, что координата лежит на воде. Поскольку Google вернул результат в отличие от приведенного выше примера, вероятность того, что это внутренний водоем, составляет 99,99%, теперь вы можете узнать его название. Если "kind" не == "hydro", используйте геокодированный объект Google.
Вот тот же код, написанный на Ruby для получения inland_body_of_water
Примечание о лицензировании: насколько мне известно, Google не позволяет вам использовать их данные для отображения на любых других картах, кроме тех, которые предлагает Google. Однако Яндекс имеет очень гибкое лицензирование, и вы можете использовать их данные для отображения на картах Google.
Также Яндекс имеет высокий лимит в 50 000 запросов в день бесплатно и без необходимого ключа API.
источник
Мне удалось подобраться довольно близко, используя Google Elevation API. Вот изображение результатов:
Вы видите, что шестиугольники в значительной степени остаются на суше, хотя определен прямоугольный периметр, который частично проходит над водой. В этом случае я сделал быструю проверку с помощью самой карты Google Maps, и минимальная высота на суше была около 8-9 м, так что это был мой порог. Код в основном скопирован / вставлен из документации Google и Stack Overflow, вот полная суть:
https://gist.github.com/dvas0004/fd541a0502528ebfb825
источник
Если
List<Address>
адрес возвращает 0, вы можете принять это местоположение как океан или природные ресурсы. Просто добавьте код ниже в свой метод ответа ответа Google Places API.Инициализируйте список ниже, как указано
List<Address> addresses = geocoder.getFromLocation(latLng.latitude, latLng.longitude, 1);
if (addresses.size()==0) { Toast.MakeText(getApplicationContext,"Ocean or Natural Resources selected",Toast.LENGTH_SHORT).show(); }else{ }
источник
Будучи полным новичком в Python, я не мог заставить решение SylvainB работать со скриптом python, который проверяет, находятся ли координаты на суше. Однако мне удалось это выяснить, загрузив OSGeo4W ( https://trac.osgeo.org/osgeo4w/ ), а затем установив все, что мне было нужно, pip, Ipython, и проверил, есть ли там весь указанный импорт. Я сохранил следующий код как файл .py.
Код, чтобы проверить, указаны ли координаты на суше
Я пытался заставить его работать в R, но мне приснился кошмар, пытаясь получить все пакеты, которые вам нужно установить, поэтому я привязался к python.
источник
У меня здесь другое решение. В текущей реализации карты Google она не рассчитывает направление / расстояние от точки воды до точки суши и наоборот. Почему бы нам не использовать эту логику, чтобы определить, является ли точка сушей или водой.
Например, возьмем этот пример
если мы хотим определить, является ли точка
x
сушей или водой, тогдадавайте проверим направление между точкой
x
и известной точкой,y
которая является сушей. Если он определяет направление / расстояние, то точкаx
- это земля или вода.источник