Проверьте, является ли точка Землей или Водой в Картах Google - PullRequest
98 голосов
/ 10 марта 2012

.. а потом гугл-карты "вод от воды делят"

Ну, не в библейском смысле, а ..

Я хотел бы знать, какие у меня есть варианты, чтобы проверить, является ли точка [Lat, Lon] землей или водой.

Google Maps, очевидно, имеет эти данные (водоемы синие) - но есть ли в API что-то, что я могу использовать для этого? А если нет - разве они не служат ему, потому что никогда не думали об этом? Или потому что это слишком сложно?

Я не нашел никакой информации по этому вопросу - за исключением некоторых подобных вопросов здесь (например, поиск типа местности или высоты - но это не совсем то, что мне нужно).

Есть ли отдельный слой для этого? Опция? Команда? Или я должен пойти сделать это вручную?

Единственный способ, которым я могу придумать, как подойти к этому (должен ли я сделать это вручную), это проверить каждую обслуживаемую плитку на предмет точной точки, а затем проверить значение RGB для этого оттенка карты Google. Это только по теории - потому что на практике - я понятия не имею, как этого добиться, первое препятствие, которое я не знаю, как я могу преобразовать местоположение пикселя на плитке в точку [LatLon], например

Готовое решение будет намного проще.

Обратите внимание, что мне не нужна ВСЕ вода в мире (например - мне нет дела до ручьев, небольших прудов, большинства рек или бассейна вашего соседа. Мне нужны точки, где человек может рисковать без помощи плавучее транспортное средство)

РЕДАКТИРОВАТЬ I

После прочтения комментариев: Метод возвышения не является надежным, слишком много мест ниже уровня моря (вы можете увидеть список самых «глубоких» 10 здесь http://geology.com/below-sea-level/) и слишком много не имеющих выхода к морю водоемов над уровнем моря ( озера). Метод обратной геолокации ненадежен, потому что он будет возвращать геополитическую единицу, такую ​​как город, или штат, или НОЛЬ много раз. Я уже изучал эти псевдо-решения, прежде чем задавать вопрос, но на самом деле никто из них не ответил на этот вопрос - эти методы в лучшем случае плохо "угадывают".

Ответы [ 18 ]

54 голосов
/ 10 марта 2012

Это 2 разных способа, вы можете попробовать:

  • Вы можете использовать Обратное геокодирование Карт Google . В наборе результатов вы можете определить, является ли это водой, проверив types. В случае с водой тип: natural_feature. Подробнее по этой ссылке http://code.google.com/apis/maps/documentation/geocoding/#Types.

    Также вам нужно проверить названия объектов, если они содержат Sea, Lake, Ocean и некоторые другие слова, связанные с водами, для большей точности. Например, пустыни также являются natural_feature с.

    Prons - Весь процесс обнаружения будет выполняться на компьютере клиента. Нет необходимости создавать собственную службу на стороне сервера.

    Минусы - Очень неточно, и шансы, что вы получите «ничего» в водах, очень высоки.

  • Вы можете обнаружить воды / земли по пикселям, используя Google Static Maps . Но для этого вам нужно создать http сервис.

    Вот шаги, которые должен выполнить ваш сервис:

    1. Получите latitude, longitude и current zoom от клиента.
    2. Отправка http://maps.googleapis.com/maps/api/staticmap?center={ широта , долгота }&zoom={ текущее увеличение`} & size = 1x1 & maptype = дорожная карта & датчик = ложный запрос к службе Google Static Map.
    3. Определение цвета пикселя статического изображения 1x1.
    4. Ответьте информацию об обнаружении.

    Вы не можете определить цвет пикселя на стороне клиента. Да, вы можете загрузить статическое изображение на компьютер клиента и нарисовать изображение на элементе canvas. Но вы не можете использовать getImageData контекста холста для получения цвета пикселя. Это ограничено междоменной политикой.

    Prons - Высокая точность обнаружения

    Минусы - Использование собственных ресурсов сервера для обнаружения

19 голосов
/ 28 июня 2013

Это невозможно с какой-либо текущей службой Google.

Но есть и другие службы, такие как Служба JSON Query для координат векторов !Вы просто запрашиваете данные в URL, и получаете ответ JSON / XML .

Пример запроса: http://api.koordinates.com/api/vectorQuery.json?key=YOUR_GEODATA_KEY&layer=1298&x=-159.9609375&y=13.239945499286312&max_results=3&radius=10000&geometry=true&with_field_names=true

Youнеобходимо зарегистрироваться и предоставить свой ключ и номер выбранного слоя.Вы можете искать во всех их хранилище доступных слоев .Большинство слоев являются только региональными, но вы также можете найти глобальные, такие как World Coastline :

enter image description here

Когда вы выбираете слой, вы нажимаете наНа вкладке «Услуги» вы получите пример запроса URL.Я считаю, что вам просто нужно зарегистрироваться и все!

А теперь самое лучшее:

Вы можете загрузить свой слой!

Он недоступенЭй, надо как-то обработать, но это должно сработать!Хранилище слоев на самом деле выглядит так, как будто люди загружали их так, как им нужно.

8 голосов
/ 22 января 2013

Это то, что я использую, и оно работает не так уж и плохо ... вы можете улучшить тест, если у вас больше процессорного времени, добавив пиксели.

function isItWatter($lat,$lng) {

    $GMAPStaticUrl = "https://maps.googleapis.com/maps/api/staticmap?center=".$lat.",".$lng."&size=40x40&maptype=roadmap&sensor=false&zoom=12&key=YOURAPIKEY";  
    //echo $GMAPStaticUrl;
    $chuid = curl_init();
    curl_setopt($chuid, CURLOPT_URL, $GMAPStaticUrl);   
    curl_setopt($chuid, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($chuid, CURLOPT_SSL_VERIFYPEER, FALSE);
    $data = trim(curl_exec($chuid));
    curl_close($chuid);
    $image = imagecreatefromstring($data);

    // this is for debug to print the image
    ob_start();
    imagepng($image);
    $contents =  ob_get_contents();
    ob_end_clean();
    echo "<img src='data:image/png;base64,".base64_encode($contents)."' />";

    // here is the test : I only test 3 pixels ( enough to avoid rivers ... )
    $hexaColor = imagecolorat($image,0,0);
    $color_tran = imagecolorsforindex($image, $hexaColor);

    $hexaColor2 = imagecolorat($image,0,1);
    $color_tran2 = imagecolorsforindex($image, $hexaColor2);

    $hexaColor3 = imagecolorat($image,0,2);
    $color_tran3 = imagecolorsforindex($image, $hexaColor3);

    $red = $color_tran['red'] + $color_tran2['red'] + $color_tran3['red'];
    $green = $color_tran['green'] + $color_tran2['green'] + $color_tran3['green'];
    $blue = $color_tran['blue'] + $color_tran2['blue'] + $color_tran3['blue'];

    imagedestroy($image);
    var_dump($red,$green,$blue);
    //int(492) int(570) int(660) 
    if($red == 492 && $green == 570 && $blue == 660)
        return 1;
    else
        return 0;
}
7 голосов
/ 19 декабря 2014

Я подумал, что было бы интереснее выполнять этот запрос локально, поэтому я могу быть более самостоятельным: скажем, я хочу генерировать 25000 случайных координат земли одновременно, я бы предпочел избегать вызовов, возможно, дорогостоящих внешних API.Вот мой пример в Python, используя пример python , упомянутый TomSchober.По сути, он ищет координаты в заранее подготовленном файле размером 350 МБ , содержащем все координаты суши, и, если там есть координаты, он печатает их., это работает чудесно.Файл "land_polygons.shp" можно загрузить здесь , комплименты OpenStreetMaps.(Я сам использовал первую ссылку на скачивание WGS84, может быть, вторая тоже работает)

7 голосов
/ 18 сентября 2013

Оформить заказ на эту статью.Он точно определяет, находится ли что-то на воде, без необходимости использования сервера.Это хак, который использует функцию пользовательского стиля в Картах Google.

http://tech.bellycard.com/blog/where-d-the-water-go-google-maps-water-pixel-detection-with-canvas/

6 голосов
/ 18 июля 2017

Существует бесплатный веб-API, который решает именно эту проблему и называется onwater.io . Это не что-то встроенное в карты Google, но с учетом широты и долготы оно точно вернет истину или ложь через запрос на получение.

Пример по воде: https://api.onwater.io/api/v1/results/23.92323,-66.3

{
  lat: 23.92323,
  lon: -66.3,
  water: true
}

Пример на суше: https://api.onwater.io/api/v1/results/42.35,-71.1

{
  lat: 42.35,
  lon: -71.1,
  water: false
}

Полное раскрытие. Я работаю в Dockwa.com , компании, работающей над водой. Мы построили на воде, чтобы решить эту проблему сами и помочь сообществу. Это бесплатно для использования (платят за большой объем), и мы хотели бы поделиться:)

5 голосов
/ 10 марта 2012

В дополнение к обратному геокодированию - как указал Dr Molle , он может возвращать ZERO_RESULTS - вы можете использовать службу Elevation. Если вы получите нулевой результат путем обратного геокодирования, получите высоту местоположения. Обычно море получает отрицательное число, поскольку морское дно находится ниже уровня моря. Есть полностью проработанный пример службы повышения прав: http://www.daftlogic.com/sandbox-google-maps-find-altitude.htm.

Имейте в виду, что, поскольку Google не предоставляет эту информацию, любой другой метод является лишь предположением, а догадки по своей сути неточны. Однако использование type, возвращенного обратным геокодированием, или превышение, если type недоступно, охватит большинство возможных ситуаций.

3 голосов
/ 04 июля 2013

Если все остальное не помогает, вы всегда можете попробовать проверить высоту в точке и на некотором расстоянии - не многие вещи, кроме воды, имеют тенденцию быть совершенно плоскими.

3 голосов
/ 10 марта 2012

Этот метод абсолютно ненадежен. Фактически, возвращаемые данные будут полностью зависеть от того, с какой частью мира вы работаете. Например, я работаю во Франции. Если я нажму на море на побережье Франции, Google вернет ближайшее местоположение LAND, в котором оно может «угадать». Когда я запросил информацию у Google по этому же вопросу, они ответили, что не могут точно вернуть запрошенную точку на водной массе.

Не очень удовлетворительный ответ, я знаю. Это довольно неприятно, особенно для тех из нас, кто предоставляет пользователю возможность щелкнуть карту, чтобы определить положение маркера.

2 голосов
/ 01 марта 2016

Мне удалось приблизиться, используя Google Elevation API.Вот изображение результатов:

screenshot of results

Вы видите, что шестиугольники в значительной степени остаются на земле, хотя определен прямоугольный периметр, который частично проходит над водой.В этом случае я сделал быструю проверку из Google Maps, и минимальная высота над уровнем моря была около 8-9 м, так что это был мой порог.Код в основном копируется / вставляется из документации Google и Stack Overflow, вот полный смысл:

https://gist.github.com/dvas0004/fd541a0502528ebfb825

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...