Переконайтеся, що на Картах Google є точка "Земля чи вода"


106

..і потім Google-карти "розділяють води від вод"

Ну, не в біблійному сенсі, але ..

Мені хотілося б дізнатися, які у мене є варіанти, щоб перевірити, чи точка [Лат, Лон] - Земля чи Вода.

Ці карти очевидно мають у Google Maps (водойми блакитні) - але чи є в API щось таке, що я можу використовувати для цього? А якщо ні - то вони не обслуговують її, бо ніколи про це не думали? Або тому, що це занадто складно?

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

Чи є для цього відокремлений шар? Варіант? Команда? Або я повинен піти робити це вручну?

Єдиний спосіб, що я можу придумати, як підійти до цього (якщо мені це потрібно зробити вручну) - перевірити кожну подану плитку на точну точку - а потім перевірити значення RGB для цього відтінку карти Google. Це лише на теорії - тому що на практиці - я не маю уявлення, як це досягти. Перша перешкода полягає в тому, що я не знаю, як я можу перетворити місце пікселя на плитці в точку [LatLon], наприклад

Готове рішення було б набагато простіше.

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

РЕДАКЦІЯ I

Після прочитання коментарів: Метод висоти не є надійним, занадто багато місць нижче рівня моря (список "найглибших" 10 ви можете побачити тут http://geology.com/below-sea-level/ ) і там надто багато замкнених наземних водойм ЗА МОРОМ (озерами). Метод зворотного геолокації не є надійним, оскільки він багато разів повертає геополітичну сутність, наприклад місто чи штат - або ZERO. Я вже розглядав ці псевдорозв’язки, перш ніж ставити питання - але жоден з них насправді не відповів на питання - ці методи в кращому випадку погано «здогадуються».


1
Можливо, ви зможете використовувати бібліотеку висот. Хоча це не завжди відповідає дійсності, я гадаю, що більшість часу справи на рівні моря є водою. Є кілька досить очевидних кутових випадків (долина смерті Каліфорнія, Нідерланди, озера в горах тощо), але це може спрацювати з приблизним наближенням.

спасибі, я вже про це думав - але, як ви вказали, - на землі занадто багато точок нижче рівня моря - виключення всіх них не є життєздатним рішенням ..
Обмерк Кронен

@michael - не кажучи вже про всі замикаючі на землю водойми, про які ви згадали .. (озера тощо)
Obmerk Kronen

Можливо, краще підходить для GIS.SE? Ви можете мігрувати, коли виграш закінчиться.
TMS

Коли ви отримали відповідь, я нічого не маю на це сказати. Але, якщо шукати дані про воду чи інформацію про ГІС, то на окремому домені http://gis.stackexchange.com/ тут відбувається окрема дискусія. , ви знайдете багато чого, що вам може знадобитися, включаючи дані про воду .. що допоможе вам у випадку .. (якщо потрібно ..) Old Post Я сподіваюся, що це допоможе ..
MarmiK

Відповіді:


55

Це два різні способи, ви можете спробувати:

  • Ви можете використовувати зворотне геокодування Google Maps . У наборі результатів ви можете визначити, чи це вода, перевіривши types. У випадку вод вод тип natural_feature. Детальніше див. За цим посиланням http://code.google.com/apis/maps/documentation/geocoding/#Types .

    Також потрібно перевірити назви особливостей, якщо вони містять, Sea, Lake, Oceanта деякі інші слова, пов’язані з водами, для більшої точності. Наприклад, пустелі також є natural_features.

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

    Мінуси - Дуже неточні, і шанси на те, що ви отримаєте "жодного" у водах, дуже високі.

  • Ви можете виявити води / суші за пікселями, скориставшись 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. Виявити піксельний колір 1х1 статичного зображення.
    4. Відповідь на інформацію про виявлення.

    Ви не можете виявити колір пікселя на стороні клієнта. Так, ви можете завантажити статичне зображення на машину клієнта і намалювати зображення на canvasелементі. Але ви не можете використовувати getImageDataконтекст полотна для отримання кольору пікселя. Це обмежується міждоменною політикою.

    Сонці - високоточне виявлення

    Мінуси - використання власних ресурсів сервера для виявлення


2
Спасибі - я вже перевірив це - я не знав, що типи перетворюють Морське озеро Океан і подібні, і як ви вказали у своїй редакції - natural_feature також буде горою, островом і пустелею. Чи можете ви вказати на документацію? також - як можна зробити зворотне геокодування для місць без адрес? а що з озером, що входить до складу геополітичної сутності? як озеро Внутрі обмеження міста чи муніципалітету (наприклад, genevre) або просто точка, яка знаходиться ВІД міського порту. У своїх випробуваннях я не в змозі зробити це ..
Obmerk Kronen

3
Більшу частину води в світі зворотне геокодування призведе до "нульових результатів", перегляньте інструмент геокодування: gmaps-samples-v3.googlecode.com/svn/trunk/geocoder/… та натисніть десь усередині океану.
Dr.Molle

@Tomas - не те, щоб я хотів бути незмінним або незрозумілим для інших "штабелерів" - але, можливо, його не проголосували, тому що це невірний / точний метод?
Обмерк Кронен

3
Використання статичних карт у запропонованому способі, ймовірно, вважатиметься порушенням Умов (10.1.1 (h)).
Ендрю Ліч

1
Що стосується підходу Статичних карт, ви можете зробити це за допомогою developers.google.com/maps/documentation/static-maps/…, але ви також можете використати статтю Saurav, пов'язану з нею.
miguev

19

Це не здається можливим для будь-якого поточного сервісу Google.

Але є й інші сервіси, як-от сервіс запитів Koordinate Vector JSON ! Ви просто запитуєте дані в URL-адресі, і ви отримуєте відповідь JSON / XML .

Приклад запиту: http://api.koordinate.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

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

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

Вибираючи шар, ви клацаєте на вкладці "Послуги", отримуєте приклад URL-адреси запиту. Я вважаю, що вам просто потрібно зареєструватися, і це все!

А зараз найкраще:

Ви можете завантажити свій шар!

Це не доступно відразу, ей треба якось це обробити, але це має працювати! Сховище шарів насправді схоже на те, що люди завантажили їх у міру необхідності.


Це виглядає майже ідеально, проте я не бачу жодних локальних карт, які не належать до Океанії. Чи є якісь шари в США?
HaloWebMaster

@HaloWebMaster шар, про який я згадував, є глобальним. Ви також можете шукати шари за регіонами.
TMS

@HaloWebMaster Я щойно помітив, що ви можете завантажити свій власний шар! Дивіться моє оновлення.
TMS

Гей, Томаш, я не знаю, ти справді отримав винагороду чи ні (так як я був тиждень поза форумом), але це приголомшливо! Дякую за вашу допомогу, я не зміг би примусити свою заявку працювати. Дякую! (Якщо ви не отримали винагороду, я її нагороджую, просто мене
вечір

Гей, ти врятував мені тиждень користувацького кодування! Воно того варте!
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;
}

Кодекси дози; не працюйте в новій версії. Нова версія має бути такою, якщо ($ red == 537 && $ green == 627 && $ blue == 765)
Wim Pruiksma

8

Існує безкоштовний веб-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 , компанії, що стоїть за водою. Ми побудували на воді, щоб вирішити цю проблему самостійно та допомогти громаді. Він безкоштовний у користуванні (оплачується великий обсяг), і ми хотіли поділитися :)


1
Оновлений приклад посилань: Приклад води: api.onwater.io/api/v1/results/23.92323,-66.3 Приклад суші: api.onwater.io/api/v1/results/42.35,-71.1
Крістіан К.

1
Це вже не безкоштовно (для більших обсягів), але якщо це виконує роботу, це все-таки дуже доступно!
Крістіан К.

Сторінка документації дає помилку. Я хотів перевірити, чи є якісь конкретні дані щодо покриття? Я маю на увазі, які країни ви охоплюєте?
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 сам, можливо, другий також працює)


А що з озерами? Чи розглядає він точки на озерах як море чи сушу?
fatma.ekici

Гарне питання! Я перевірив на сторінці дані OpenStreetMaps, які були пов’язані у моїй відповіді , і там написано, що файл land базує свої значення на тезі natural=coastline. Швидке гуглювання дає можливість скористатися цією сторінкою, яка спеціально стверджує, що мітки узбережжя насправді не застосовуються до озер у їх номенклатурі. Тому я б сказав, що ні , мій метод не визначає озера як води, оскільки набір даних, який я використовую, не має. Але спробуйте самі!
SylvainB

7

Оформити замовлення цю статтю . Він точно визначає, чи щось на воді, не потребуючи сервера. Це хак, який спирається на функцію користувацького стилю в Картах Google.


5

Окрім зворотного геокодування - як зазначив доктор Молл , він може повернути ZERO_RESULTS - ви можете скористатися послугою Elevation. Якщо ви отримаєте нульові результати шляхом зворотного геокодування, отримайте висоту місцеположення. Як правило, море отримує від’ємне число, оскільки морське дно нижче рівня моря. Є повністю відпрацьований приклад служби піднесення.

Майте на увазі, що оскільки Google не надає цю інформацію, будь-який інший метод є лише здогадкою, і здогадки є по суті неточними. Однак використання typeповернутого зворотним геокодування або висота, якщо typeїї немає, охопить більшість випадків.


дякую за вашу відповідь та приклад посилання (BTW - він не працює в Opera для мене) - але я не можу реально ігнорувати всі ділянки, які є земельними та негативними, і мої експерименти показали, що ТИП не є надійним - і багато разів повертається геополітична історія, що знаходиться поруч. повинен бути якийсь більш точний метод - "здогадування" тут не здається правильним підходом. Якби ТИП був надійним - це було б найкращим рішенням - але це не так ... і ви ігноруєте всі
незаземлені

3

Цей метод абсолютно ненадійний. Насправді повернені дані будуть повністю залежати від того, з якою частиною світу ви працюєте. Наприклад, я працюю у Франції. Якщо я натисніть на море на узбережжі Франції, Google поверне найближче місце розташування Землі, про яке він може "здогадатися". Коли я попросив інформацію від Google щодо цього ж запитання, вони відповіли, що вони не можуть точно повернути запитувану точку про водну масу.

Я не дуже задовільна відповідь, я знаю. Це досить засмучує, особливо для тих із нас, хто надає користувачеві можливість натиснути на карту, щоб визначити позицію маркера.


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

3

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


дякую, це гарна ідея, але вона вражає невдало на кожному водоспаді чи каньйоні річки ...
Obmerk Kronen

2

На жаль, ця відповідь не входить в API Карт Google, і посилається ресурс не є безкоштовним, але існує веб-служба, надана 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");
    }
});


2

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

Це можна зробити через бінарні файли GDAL, джерело C або через swig в Java, Python тощо.

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

Інформація GDAL

Приклад запиту точок у Python


1

Ось просте рішення

Оскільки Google не надає достовірних результатів щодо координат, які лежать на океані чи на внутрішніх водоймах, вам потрібно скористатися іншою службою резервного копіювання, наприклад, Яндексом, щоб допомогти забезпечити цю критичну інформацію, коли її немає. Ви, швидше за все, не хотіли б використовувати Яндекс як основний геокодер, оскільки Google набагато перевершує надійність та повноту даних про світи, проте Яндекс може бути дуже корисним для отримання даних, коли це стосується координат над водоймами, тому використовуйте обидва.


Документація Яндекс: https://api.yandex.com.tr/maps/doc/geocoder/desc/concepts/input_params.xml


Крок для отримання імені океану:

1.) Спершу скористайтеся Google, щоб повернути геокодування координати.

2.) Якщо Google поверне нульові результати, цілком імовірно, що координата лежить над океаном. Тепер зробіть вторинний зворотний запит геокодування з тими ж координатами до Яндекс. Яндекс поверне відповідь 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 ярдів), тоді виконайте вторинний запит резервного копіювання з Яндексом і перевірте, чи є значення клавіші "вид", якщо це "гідро", то ви знаєте, що координата лежить на воді. Оскільки 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.


1

Мені вдалося досить близько наблизитися за допомогою API Google Elevation. Ось зображення результатів:

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

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

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


Тільки FYI, документацію API Google Elevation можна знайти тут: developers.google.com/maps/documentation/javascript/elevation
dvas0004

2
це чудовий приклад можливого використання. але вона славно провалиться на водоймах із замкнутим водою (Lago di garda - Італія на прикладі пов'язаного зображення). Дуже приємний код, який вважається використаним як можлива основа для іншого рішення!
Обмерк Кронен

1

Якщо List<Address>адреса повертає 0, ви можете вважати це місце розташування океаном чи природними ресурсами. Просто додайте нижче код у своєму способі відповіді API Google Місця на карті.

Ініціалізуйте нижче список, як згадувалося

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- це земля, або ж це вода.


Ви насправді пробували це чи просто припускаєте, що «готуєте з води»?
TMS

А як ви гадаєте, що обробляти мости? чи тунелі?
Обмерк Кронен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.