Проверьте, является ли точка землей или водой на Картах Google

107

..и тогда гугл-карты «отделяют воду от воды»

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

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

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

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

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

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

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

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

ИЗМЕНИТЬ I

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

Обмерк Кронен
источник
1
Возможно, вы сможете использовать библиотеку высот. Хотя это не всегда верно, я полагаю, что большую часть времени на уровне моря происходит вода. Есть несколько довольно очевидных угловых случаев (Долина Смерти, Калифорния, Нидерланды, озера в горах и т. Д.), Но это может сработать для грубого приближения.
спасибо, я уже подумал об этом - но, как вы отметили, на Земле слишком много точек ниже уровня моря - исключение всех из них не является жизнеспособным решением ..
Обмерк Кронен
@michael - не говоря уже о всех упомянутых вами водоемах, не имеющих выхода к морю .. (озера и т. д.)
Обмерк Кронен
Может лучше подойдет для GIS.SE? Вы можете мигрировать, когда закончится награда.
TMS
Как вы получили ответ, у меня нет ничего , чтобы сказать о том , что .. Но, если ищете данные воды, или информации ГИС, а есть отдельная discussiong происходит на нашем отдельном домене http://gis.stackexchange.com/ Здесь , вы найдете много всего, что вам может понадобиться, в том числе данные о воде .. которые помогут вам в случае .. (если потребуется ..) Old Post Я надеюсь, что это поможет ..
MarmiK 04

Ответы:

55

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

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

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

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

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

  • Вы можете определять воды / земли по пикселям с помощью статических карт Google . Но для этого вам нужно создать http-сервис.

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

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

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

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

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

Инженер
источник
2
Спасибо - я уже проверил это - я не знал, что типы превращаются в Sea Lake Ocean и тому подобное, и, как вы указали в своей редакции, natural_feature также может быть гора, остров и пустыня .. указать на документацию? также - как сделать обратное геокодирование для мест без адресов? а как насчет озера, которое является частью геополитического образования? как озеро ВНУТРИ города или границы муниципалитета (например, Genevre) или просто точка, которая ВНУТРИ городского порта. В моих испытаниях я не смог этого сделать ..
Обмерк Кронен
3
Для большей части воды в мире обратное геокодирование вернет «нулевые результаты», воспользуйтесь инструментом геокодирования: gmaps-samples-v3.googlecode.com/svn/trunk/geocoder/… и щелкните где-нибудь внутри океана.
Доктор Молле
@Tomas - не то чтобы я хотел быть неблагодарным или неуважительным по отношению к другим «укладчикам» - но, может быть, это не голосование, потому что это неверный / точный метод?
Обмерк Кронен
3
Использование статических карт предложенным способом, вероятно, будет сочтено нарушением Условий (10.1.1 (h)).
Эндрю Лич,
1
Что касается подхода со статическими картами, вы можете сделать это с помощью style developers.google.com/maps/documentation/static-maps/…, но с тем же успехом можете использовать ссылку Saurav.
miguev 09
19

Это кажется невозможным ни с одним текущим сервисом Google.

Но есть и другие службы, например, служба запросов Koordinates Vector JSON ! Вы просто запрашиваете данные в 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

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

введите описание изображения здесь

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

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

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

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

ТМС
источник
это выглядит почти идеально, однако я не вижу никаких местных карт, не относящихся к Океании. Есть ли слои из США?
HaloWebMaster
@HaloWebMaster - упомянутый мной слой является глобальным. И вы также можете искать слои по региону.
TMS
@HaloWebMaster Я только что заметил, что вы можете загрузить свой собственный слой! Смотрите мое обновление.
TMS
Привет, Томас, я не знаю, действительно ли ты получил награду или нет (так как я был офлайн в течение недели), но это потрясающе! Спасибо за вашу помощь, я бы не смог заставить мое приложение работать. Спасибо! (Если вы не получили награду, я награжу ее, просто напишите мне в личку)
HaloWebMaster
Эй, вы сэкономили мне неделю пользовательского кодирования! Это стоит того!
HaloWebMaster
8

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

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;
}
rebe100x
источник
Код работает над новой версией. Новая версия должна быть такой if ($ red == 537 && $ green == 627 && $ blue == 765)
Вим Пруиксма
8

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

Пример на воде: 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 , компании, стоящей за onwater. Мы построили onwater, чтобы сами решить эту проблему и помочь сообществу. Его можно использовать бесплатно (платно за большой объем), и мы хотели поделиться :)

Стуям
источник
1
Обновленные ссылки на примеры : Water Example: api.onwater.io/api/v1/results/23.92323,-66.3 Land Example: api.onwater.io/api/v1/results/42.35,-71.1
Christian K.
1
Это больше не бесплатно (для больших объемов), но если оно работает, то все еще очень доступно!
Christian K.
На странице документации выдается ошибка. Я хотел проверить, есть ли какие-либо данные о покрытии? Я имею в виду, в каких странах вы работаете?
nr5
Подходит ли onwater.io для озер и рек? Если да, могу ли я указать тип?
luksch
7

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

import ogr
from IPython import embed
import sys

drv = ogr.GetDriverByName('ESRI Shapefile') #We will load a shape file
ds_in = drv.Open("land_polygons.shp")    #Get the contents of the shape file
lyr_in = ds_in.GetLayer(0)    #Get the shape file's first layer

#Put the title of the field you are interested in here
idx_reg = lyr_in.GetLayerDefn().GetFieldIndex("P_Loc_Nm")

#If the latitude/longitude we're going to use is not in the projection
#of the shapefile, then we will get erroneous results.
#The following assumes that the latitude longitude is in WGS84
#This is identified by the number "4236", as in "EPSG:4326"
#We will create a transformation between this and the shapefile's
#project, whatever it may be
geo_ref = lyr_in.GetSpatialRef()
point_ref=ogr.osr.SpatialReference()
point_ref.ImportFromEPSG(4326)
ctran=ogr.osr.CoordinateTransformation(point_ref,geo_ref)

def check(lon, lat):
    #Transform incoming longitude/latitude to the shapefile's projection
    [lon,lat,z]=ctran.TransformPoint(lon,lat)

    #Create a point
    pt = ogr.Geometry(ogr.wkbPoint)
    pt.SetPoint_2D(0, lon, lat)

    #Set up a spatial filter such that the only features we see when we
    #loop through "lyr_in" are those which overlap the point defined above
    lyr_in.SetSpatialFilter(pt)

    #Loop through the overlapped features and display the field of interest
    for feat_in in lyr_in:
        # success!
        print lon, lat

check(-95,47)

Перепробовал с десяток координат, работает замечательно. Файл "land_polygons.shp" можно скачать здесь , комплимент OpenStreetMaps. (Я сам использовал первую ссылку для скачивания WGS84, может быть, вторая тоже работает)

SylvainB
источник
А как насчет озер? Считает ли он точки на озерах морем или сушей?
fatma.ekici
Хороший вопрос! Я проверил страницу с данными OpenStreetMaps, которые были связаны в моем ответе , и там говорится, что файл земель основывает свои значения на теге natural=coastline. Быстрый поиск в Google дает возможность использовать эту страницу, на которой конкретно указано, что теги береговой линии фактически не применяются к озерам в их номенклатуре. Поэтому я бы сказал, что нет , мой метод не определяет озера как воду, поскольку набор данных, который я использую, не определяет. Но попробуйте сами!
SylvainB
7

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

Саурав
источник
5

В дополнение к обратному геокодированию - как указал доктор Молл , оно может возвращать ZERO_RESULTS - вы можете использовать службу Elevation. Если обратное геокодирование дает нулевые результаты, получите высоту местоположения. Как правило, море получает отрицательное число, поскольку морское дно находится ниже уровня моря. Есть полностью проработанный пример службы подъема.

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

Эндрю Лич
источник
спасибо за ваш ответ и ссылку на пример (кстати, это не работает в Opera для меня) - но я не могу игнорировать все области, которые являются наземными и отрицательными, и мои эксперименты показали, что TYPE ненадежен - и много раз возвращается близлежащий геополитический объект. должен быть какой-то более точный метод - "угадывание" здесь не кажется правильным. Если бы ТИП был надежным - это было бы лучшее решение - но это не так ... и вы игнорируете все не имеющие выхода к морю водные объекты, которые находятся НАД уровнем моря ...
Обмерк Кронен
3

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

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

Саймон
источник
1
Я согласен - методы, предложенные @ user1113426 и @Andrew Leach, на самом деле не являются методами. лучше сказать пользователям "не нажимайте на синие области" :-) но серьезно - я очень удивлен, что Google не хочет выпускать такую ​​функцию - даже если приблизительную - лучше, чем "приближение", которое существует сейчас - что, как вы, указатель - иногда "привязывается" к местоположению за сотни метров от вас. Даже предложенный мной метод более точен (жаль, что я понятия не имею, как этого добиться)
Обмерк Кронен
3

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

Стив Барнс
источник
спасибо, это хорошая идея, но она будет эффектно провалиться на каждом водопаде или каньоне реки ...
Обмерк Кронен
2

К сожалению, этого ответа нет в Google Maps API, и указанный ресурс не является бесплатным, но есть веб-сервис, предоставляемый DynamicGeometry, который предоставляет операцию, GetWaterOrLandкоторая принимает пару широта / долгота ( вы можете увидеть демонстрацию здесь ).

Я понимаю, как это реализовано, с помощью файлов формы водного тела. Как именно эти шейп-файлы используются с API Карт Google, но вы можете получить некоторое представление о связанной демонстрации.

Надеюсь, что это каким-то образом поможет.

продавать
источник
2

Вот еще один пример на чистом JavaScript: http://jsfiddle.net/eUwMf/

Как видите, идея в основном такая же, как и у rebe100x, получение изображения из API статической карты Google и чтение первого пикселя:

$("#xGps, #yGps").change(function() {
    var img = document.getElementById('mapImg');

    // Bypass the security issue : drawing a canvas from an external URL.
    img.crossOrigin='anonymous';

    var xGps = $("#xGps").val();
    var yGps = $("#yGps").val();

    var mapUrl = "http://maps.googleapis.com/maps/api/staticmap?center=" + xGps + "," + yGps +
        "&zoom=14&size=20x20&maptype=roadmap&sensor=false";

    // mapUrl += "&key=" + key;

    $(img).attr("src", mapUrl);

    var canvas = $('<canvas/>')[0];
    canvas.width = img.width;
    canvas.height = img.height;
    canvas.getContext('2d').drawImage(img, 0, 0, img.width, img.height);

    var pixelData = canvas.getContext('2d').getImageData(1, 1, 1, 1).data;

    if (pixelData[0] == 164 &&
        pixelData[1] == 190 &&
        pixelData[2] == 220) {
        $("#result").html("Water");
    } else {
        $("#result").html("Not water");
    }
});
IcanDivideBy0
источник
2

Я бы порекомендовал прокатить здесь свой собственный. Вы можете использовать такие инструменты, как GDAL, для запроса содержимого под точкой в ​​шейп-файле. Вы можете получить шейп-файлы по географии США из многих источников, включая Бюро переписи населения США .

Это можно сделать через двоичные файлы GDAL, исходный код C или через swig в Java, Python и т. Д.

Карты переписи

Информация о GDAL

Пример точечного запроса в Python

TomSchober
источник
1

Вот простое решение

Поскольку 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"]

Отметьте добрый ключ, если он == "hydro", вы знаете, что находитесь над водоемом, и поскольку Google дал нулевые результаты, с вероятностью 99,99% этот водоем является океаном. Название океана будет указанным выше ключом "name".

Вот пример того, как я использую эту стратегию, написанную на 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.

heading_to_tahiti
источник
1

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

скриншот результатов

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

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

dvas0004
источник
К вашему сведению, документацию по API Google Elevation можно найти здесь: developers.google.com/maps/documentation/javascript/elevation
dvas0004 01
2
это отличный пример возможного использования. но он потерпит неудачу на закрытых водоемах (Lago di garda - Италия в примере связанного изображения). Очень хороший код, который можно использовать в качестве возможной основы для другого решения!
Обмерк Кронен 04
1

Если 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{ }

Кумар П.Г.
источник
0

Будучи полным новичком в Python, я не мог заставить решение SylvainB работать со скриптом python, который проверяет, находятся ли координаты на суше. Однако мне удалось это выяснить, загрузив OSGeo4W ( https://trac.osgeo.org/osgeo4w/ ), а затем установив все, что мне было нужно, pip, Ipython, и проверил, есть ли там весь указанный импорт. Я сохранил следующий код как файл .py.

Код, чтобы проверить, указаны ли координаты на суше

###make sure you check these are there and working separately before using the .py file 

import ogr
from IPython import embed
from osgeo import osr
import osgeo

import random
#####generate a 1000 random coordinates
ran1= [random.uniform(-180,180) for x in range(1,1001)]
ran2= [random.uniform(-180,180) for x in range(1,1001)]


drv = ogr.GetDriverByName('ESRI Shapefile') #We will load a shape file
ds_in = drv.Open("D:\Downloads\land-polygons-complete-4326\land-polygons-complete-4326\land_polygons.shp")    #Get the contents of the shape file
lyr_in = ds_in.GetLayer(0)    #Get the shape file's first layer

#Put the title of the field you are interested in here
idx_reg = lyr_in.GetLayerDefn().GetFieldIndex("P_Loc_Nm")

#If the latitude/longitude we're going to use is not in the projection
#of the shapefile, then we will get erroneous results.
#The following assumes that the latitude longitude is in WGS84
#This is identified by the number "4236", as in "EPSG:4326"
#We will create a transformation between this and the shapefile's
#project, whatever it may be
geo_ref = lyr_in.GetSpatialRef()
point_ref=osgeo.osr.SpatialReference()
point_ref.ImportFromEPSG(4326)
ctran=osgeo.osr.CoordinateTransformation(point_ref,geo_ref)
###check if the random coordinates are on land
def check(runs):
    lon=ran1[runs]
    lat=ran2[runs]
    #Transform incoming longitude/latitude to the shapefile's projection
    [lon,lat,z]=ctran.TransformPoint(lon,lat)
    #Create a point
    pt = ogr.Geometry(ogr.wkbPoint)
    pt.SetPoint_2D(0, lon, lat)
    #Set up a spatial filter such that the only features we see when we
    #loop through "lyr_in" are those which overlap the point defined above
    lyr_in.SetSpatialFilter(pt)
    #Loop through the overlapped features and display the field of interest
    for feat_in in lyr_in:
        return(lon, lat)

###give it a try
result = [check(x) for x in range(1,11)] ###checks first 10 coordinates

Я пытался заставить его работать в R, но мне приснился кошмар, пытаясь получить все пакеты, которые вам нужно установить, поэтому я привязался к python.

Алек Кристи
источник
-3

У меня здесь другое решение. В текущей реализации карты Google она не рассчитывает направление / расстояние от точки воды до точки суши и наоборот. Почему бы нам не использовать эту логику, чтобы определить, является ли точка сушей или водой.

Например, возьмем этот пример

если мы хотим определить, является ли точка xсушей или водой, тогда

давайте проверим направление между точкой xи известной точкой, yкоторая является сушей. Если он определяет направление / расстояние, то точка x- это земля или вода.

блганеш101
источник
Вы пробовали это на самом деле или просто предполагаете, что «готовят из воды»?
TMS
А как вы думаете управлять мостами? или туннели?
Обмерк Кронен 04