Verifikasi apakah suatu titik adalah Tanah atau Air di Google Maps

107

..dan kemudian Google-maps "pisahkan perairan dari perairan"

Tidak dalam arti alkitabiah tapi ..

Saya ingin tahu opsi apa yang saya miliki untuk memverifikasi apakah titik [Lat, Lon] adalah Tanah atau Air.

Google Maps jelas memiliki data ini (badan air berwarna biru) - tetapi apakah ada sesuatu di API yang dapat saya gunakan untuk itu? Dan jika tidak - apakah mereka tidak menyajikannya karena mereka tidak pernah memikirkannya? Atau karena terlalu rumit?

Saya belum menemukan info apa pun tentang masalah tersebut - kecuali beberapa pertanyaan serupa di sini (seperti menemukan jenis medan, atau ketinggian - tetapi bukan itu yang saya butuhkan).

Apakah ada lapisan terpisah untuk itu? Sebuah pilihan? Perintah? Atau haruskah saya melakukannya secara manual?

Satu-satunya cara yang dapat saya pikirkan tentang bagaimana mendekati ini (haruskah saya melakukannya secara manual) adalah dengan memeriksa setiap ubin yang disajikan untuk titik yang tepat - dan kemudian memeriksa nilai RGB untuk warna peta Google itu. Ini hanya teori - karena dalam praktiknya - saya tidak tahu bagaimana mencapainya, kendala pertama adalah saya tidak tahu bagaimana saya dapat mengubah lokasi piksel pada ubin menjadi titik [LatLon] misalnya

Solusi yang sudah jadi akan jauh lebih mudah.

Perhatikan bahwa saya tidak membutuhkan SEMUA air di dunia (misalnya - saya tidak peduli dengan sungai, kolam kecil, sebagian besar sungai atau kolam renang tetangga Anda. Saya membutuhkan titik di mana seseorang dapat menjelajah tanpa bantuan kendaraan apung )

EDIT I

Setelah membaca komentar: Metode elevasi tidak dapat diandalkan, ada terlalu banyak tempat DI BAWAH permukaan laut (Anda dapat melihat daftar 10 "terdalam" di sini http://geology.com/below-sea-level/ ) dan di sana terlalu banyak badan air yang terkurung daratan DI ATAS permukaan laut (danau). Metode geolokasi terbalik tidak dapat diandalkan karena akan mengembalikan entitas Geo-politik, seperti kota, atau negara bagian - atau NOL berkali-kali. Saya telah melihat solusi semu tersebut sebelum mengajukan pertanyaan - tetapi tidak satupun dari mereka benar-benar menjawab pertanyaan - metode tersebut paling buruk "menebak".

Obmerk Kronen
sumber
1
Anda mungkin bisa menggunakan perpustakaan elevasi. Meskipun tidak selalu benar, saya membayangkan bahwa sebagian besar waktu di permukaan laut adalah air. Ada beberapa kasus sudut yang cukup jelas (Death Valley CA, Belanda, danau di pegunungan, dll.) Tetapi mungkin berhasil untuk perkiraan kasar.
terima kasih, saya sudah memikirkannya - tetapi seperti yang Anda tunjukkan - ada terlalu banyak titik di bawah permukaan laut di bumi - tidak termasuk semuanya bukanlah solusi yang layak ..
Obmerk Kronen
@ michael - belum lagi semua badan air terkurung daratan yang Anda sebutkan .. (danau dll ..)
Obmerk Kronen
Mungkin lebih cocok untuk GIS.SE? Anda dapat bermigrasi saat karunia berakhir.
TMS
Karena Anda telah menerima jawaban, saya tidak bisa mengatakan apa-apa tentang itu .. Tetapi, jika mencari data air, atau informasi GIS, nah ada diskusi terpisah yang terjadi di domain terpisah kami http://gis.stackexchange.com/ Di sini , Anda akan menemukan banyak hal yang mungkin Anda perlukan, termasuk data air .. yang akan membantu Anda jika .. (jika diperlukan ..) Posting Lama Saya harap ini akan membantu ..
MarmiK

Jawaban:

55

Ini adalah 2 cara berbeda, Anda dapat mencoba:

  • Anda dapat menggunakan Google Maps Reverse Geocoding . Di set hasil Anda dapat menentukan apakah itu air dengan memeriksa types. Jenis kasus di perairan adalah natural_feature. Lihat selengkapnya di tautan ini http://code.google.com/apis/maps/documentation/geocoding/#Types .

    Anda juga perlu memeriksa nama fitur, jika mengandung Sea, Lake, Oceandan beberapa kata lain yang terkait dengan perairan untuk lebih akurat. Misalnya gurun juga adalah natural_features.

    Pro - Semua proses deteksi akan dilakukan di mesin klien. Tidak perlu membuat layanan sisi server sendiri.

    Kontra - Sangat tidak akurat dan kemungkinan Anda akan mendapatkan "tidak ada" di perairan sangat tinggi.

  • Anda dapat mendeteksi perairan / daratan dengan piksel, dengan menggunakan Google Static Maps . Tetapi untuk tujuan ini Anda perlu membuat layanan http.

    Ini adalah langkah-langkah yang harus dilakukan layanan Anda:

    1. Terima latitude, longitudedan current zoomdari klien.
    2. Kirim http://maps.googleapis.com/maps/api/staticmap?center={garis lintang ,bujur }&zoom={zoom`} & size = 1x1 & maptype = roadmap & sensor = false request ke layanan Google Static Map.
    3. Mendeteksi warna piksel gambar statis 1x1.
    4. Menanggapi informasi tentang deteksi.

    Anda tidak dapat mendeteksi warna piksel di sisi klien. Ya, Anda dapat memuat gambar statis pada mesin klien dan menggambar gambar pada canvaselemen. Tetapi Anda tidak dapat menggunakan getImageDatakonteks kanvas untuk mendapatkan warna piksel. Ini dibatasi oleh kebijakan lintas domain.

    Prons - Deteksi yang sangat akurat

    Kontra - Penggunaan sumber daya server sendiri untuk deteksi

Insinyur
sumber
2
Terima kasih - Saya sudah memeriksanya - Saya tidak tahu bahwa jenisnya mengubah Laut Danau Lautan dan sejenisnya, dan seperti yang Anda tunjukkan dalam suntingan Anda - natural_feature juga akan menjadi gunung, pulau, dan gurun .. Bisakah Anda mungkin menunjuk ke dokumentasi? juga - bagaimana Anda bisa melakukan geocoding terbalik untuk tempat-tempat tanpa alamat? dan bagaimana dengan danau yang merupakan bagian dari entitas geoploitik? seperti danau DI DALAM batas kota atau kotamadya (misalnya genevre) atau hanya titik yang DI DALAM pelabuhan kota. Dalam uji coba saya, saya gagal melakukannya ..
Obmerk Kronen
3
Untuk sebagian besar air di dunia, geocoding terbalik akan mengembalikan "hasil nol", periksa alat geocoding: gmaps-samples-v3.googlecode.com/svn/trunk/geocoder/… dan klik di suatu tempat di dalam lautan.
Dr. Molle
@ Tomas - bukan berarti saya tidak ingin berterima kasih atau tidak menghormati sesama "stacker" - tetapi mungkin itu tidak dipilih karena itu bukan metode yang valid / akurat?
Obmerk Kronen
3
Menggunakan Peta Statis dengan cara yang diusulkan mungkin akan dianggap melanggar Persyaratan (10.1.1 (h)).
Andrew Leach
1
Sedangkan untuk pendekatan Static Maps, Anda dapat melakukannya dengan style developers.google.com/maps/documentation/static-maps/… tetapi mungkin juga menggunakan artikel Saurav tertaut.
miguev
19

Tampaknya tidak mungkin dengan layanan Google saat ini.

Tetapi ada layanan lain, seperti layanan Kueri JSON Koordinates Vector ! Anda cukup membuat kueri data di URL, dan Anda mendapatkan kembali respons JSON / XML .

Contoh permintaan: 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

Anda harus mendaftar dan memberikan kunci Anda dan nomor lapisan yang dipilih. Anda dapat mencari semua repositori mereka dari lapisan yang tersedia . Sebagian besar lapisan hanya bersifat regional, tetapi Anda juga dapat menemukan global, seperti Garis Pantai Dunia :

masukkan deskripsi gambar di sini

Ketika Anda memilih sebuah layer, Anda mengklik pada tab "Services", Anda mendapatkan contoh URL permintaan. Saya yakin Anda hanya perlu mendaftar dan hanya itu!

Dan sekarang yang terbaik:

Anda dapat mengunggah lapisan Anda!

Ini tidak langsung tersedia, hei harus memprosesnya, tetapi harus berfungsi! Repositori lapisan benar-benar terlihat seperti orang mengunggahnya sesuai kebutuhan.

TMS
sumber
ini terlihat hampir sempurna, namun saya tidak melihat peta lokal yang bukan dari Oceania. Apakah ada lapisan AS?
HaloWebMaster
@HaloWebMaster lapisan yang saya sebutkan bersifat global. Dan Anda juga dapat mencari lapisan berdasarkan wilayah.
TMS
@HaloWebMaster Saya baru tahu Anda dapat mengunggah lapisan Anda sendiri! Lihat pembaruan saya.
TMS
Hei, Tomas, saya tidak tahu apakah Anda benar-benar mendapatkan bounty atau tidak (karena saya offline selama seminggu) tapi ini luar biasa! Terima kasih atas bantuan Anda, saya tidak akan bisa membuat aplikasi saya berfungsi. Terima kasih! (Jika Anda tidak mendapatkan bounty, saya akan menghadiahkannya, hanya PM saya)
HaloWebMaster
Hai, Anda menghemat waktu saya untuk pengkodean khusus selama seminggu! Itu sangat berharga!
HaloWebMaster
8

Ini yang saya gunakan dan berfungsi tidak terlalu buruk ... Anda dapat meningkatkan pengujian jika Anda memiliki lebih banyak cpu untuk dibuang dengan menambahkan piksel.

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
sumber
Kode tidak berfungsi pada versi baru. Versi baru akan seperti ini jika ($ red == 537 && $ green == 627 && $ blue == 765)
Wim Pruiksma
8

Ada API web gratis yang memecahkan masalah ini dengan tepat yang disebut onwater.io . Ini bukan sesuatu yang dibangun ke dalam peta Google, tetapi diberi garis lintang dan bujur itu akan secara akurat mengembalikan benar atau salah melalui permintaan get.

Contoh di air: https://api.onwater.io/api/v1/results/23.92323,-66.3

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

Contoh di darat: https://api.onwater.io/api/v1/results/42.35,-71.1

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

Pengungkapan penuh Saya bekerja di Dockwa.com , perusahaan di belakang onwater. Kami membangun di atas air untuk memecahkan masalah ini sendiri dan membantu komunitas. Ini gratis untuk digunakan (dibayar untuk volume tinggi) dan kami ingin berbagi :)

stuyam
sumber
1
Link Contoh yang Diperbarui: Contoh Air: api.onwater.io/api/v1/results/23.92323,-66.3 Contoh Tanah: api.onwater.io/api/v1/results/42.35,-71.1
Christian K.
1
Ini tidak gratis lagi (untuk volume yang lebih tinggi), tetapi jika berhasil, harganya masih sangat terjangkau!
Christian K.
Halaman dokumentasi memberikan kesalahan. Saya ingin memeriksa apakah ada data khusus cakupan? Maksud saya, negara mana yang Anda cakup?
nr5
Apakah onwater.io berfungsi untuk danau dan sungai? Jika ya, apakah saya mendapatkan indikasi jenisnya?
luksch
7

Saya pikir lebih menarik untuk melakukan kueri ini secara lokal, jadi saya bisa lebih mandiri: katakanlah saya ingin menghasilkan 25.000 koordinat tanah acak sekaligus, saya lebih suka menghindari panggilan ke API eksternal yang mungkin mahal. Ini adalah bidikan saya dalam python, menggunakan contoh python yang disebutkan oleh TomSchober. Pada dasarnya ini mencari koordinat pada file 350MB yang dibuat sebelumnya yang berisi semua koordinat tanah, dan jika koordinat ada di sana, ini akan mencetaknya.

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)

Saya mencoba selusin koordinat, hasilnya luar biasa. File "land_polygons.shp" dapat diunduh di sini , pujian dari OpenStreetMaps. (Saya menggunakan tautan unduhan WGS84 pertama sendiri, mungkin yang kedua juga berfungsi)

SylvainB
sumber
Bagaimana dengan danau? Apakah itu menganggap titik di danau sebagai laut atau darat?
fatma.ekici
Pertanyaan bagus! Saya memeriksa halaman ke data OpenStreetMaps yang ditautkan dalam jawaban saya , dan dikatakan bahwa file tanah mendasarkan nilainya pada tag natural=coastline. Googling cepat memberikan penggunaan halaman ini yang secara khusus menyatakan bahwa tag garis pantai sebenarnya tidak berlaku untuk danau dalam nomenklaturnya. Jadi saya akan mengatakan bahwa tidak , metode saya tidak mengidentifikasi danau sebagai air, karena kumpulan data yang saya gunakan tidak. Tapi coba sendiri!
SylvainB
7

Lihat artikel ini . Secara akurat mendeteksi jika ada sesuatu di air tanpa memerlukan server. Ini adalah peretasan yang mengandalkan fitur gaya khusus di Google Maps.

Saurav
sumber
5

Selain geocoding terbalik - seperti yang dikatakan Dr Molle , ini mungkin mengembalikan ZERO_RESULTS - Anda dapat menggunakan layanan Elevation. Jika Anda mendapatkan hasil nol dengan geocoding terbalik, dapatkan ketinggian lokasi. Umumnya laut mendapat angka negatif karena dasar laut berada di bawah permukaan laut. Ada contoh layanan elevasi yang berfungsi sepenuhnya .

Ingatlah bahwa karena Google tidak menyediakan informasi ini, metode lain hanyalah tebakan dan tebakan pada dasarnya tidak akurat. Namun menggunakan typegeocoding balik yang dikembalikan, atau ketinggian jika typetidak tersedia, akan mencakup sebagian besar kemungkinan.

Andrew Leach
sumber
terima kasih atas jawaban Anda dan tautan contoh (BTW - ini tidak berfungsi di Opera untuk saya) - tetapi saya tidak dapat mengabaikan semua area yang tanah dan negatif dan percobaan saya menunjukkan bahwa JENIS tidak dapat diandalkan - dan berkali-kali kembali entitas geopolitik yang dekat. pasti ada metode yang lebih tepat - "menebak" sepertinya bukan pendekatan yang tepat di sini. Jika TYPE dapat diandalkan - Ini akan menjadi solusi terbaik - tetapi tidak ... dan Anda mengabaikan semua badan air yang terkunci di daratan yang DI ATAS permukaan laut ...
Obmerk Kronen
3

Metode ini sama sekali tidak bisa diandalkan. Faktanya, data yang dikembalikan akan sepenuhnya bergantung pada bagian dunia mana yang Anda tangani. Misalnya, saya bekerja di Prancis. Jika saya mengeklik laut di pantai Prancis, Google akan mengembalikan lokasi TANAH terdekat yang dapat "ditebak". Ketika saya meminta informasi dari Google untuk pertanyaan yang sama ini, mereka menjawab bahwa mereka tidak dapat secara akurat mengembalikan poin yang diminta pada massa air.

Bukan jawaban yang sangat memuaskan, saya tahu. Ini cukup membuat frustrasi, terutama bagi kita yang memberi pengguna kemampuan untuk mengklik peta untuk menentukan posisi penanda.

Simon
sumber
1
Saya setuju - metode yang disarankan oleh @ user1113426 dan @Andrew Leach sebenarnya bukan metode. lebih baik memberi tahu pengguna "jangan klik pada area biru" :-) tapi serius - Saya sangat terkejut bahwa google tidak ingin merilis fungsi seperti itu - meskipun hanya perkiraan - lebih baik daripada "perkiraan" yang ada sekarang - seperti yang Anda tunjuk - terkadang "terkunci" ke lokasi yang jauhnya ratusan meter. Bahkan metode yang saya sarankan lebih akurat (sayang sekali saya tidak tahu bagaimana melakukannya.)
Obmerk Kronen
3

Jika semuanya gagal, Anda selalu dapat mencoba memeriksa ketinggian pada titik dan untuk jarak tertentu - tidak banyak hal selain air yang cenderung benar-benar datar.

Steve Barnes
sumber
terima kasih, ini adalah ide yang bagus, tetapi akan gagal secara spektakuler di setiap air terjun, atau ngarai sungai ...
Obmerk Kronen
2

Sayangnya jawaban ini tidak ada dalam Google Maps API dan referensi referensi tidak gratis, tetapi ada layanan web yang disediakan oleh DynamicGeometry yang mengekspos operasi GetWaterOrLandyang menerima pasangan garis lintang / garis bujur ( Anda dapat melihat demo di sini ).

Pemahaman saya tentang bagaimana ini diterapkan adalah dengan menggunakan file bentuk badan air. Bagaimana tepatnya file bentuk ini digunakan dengan Google Maps API, tetapi Anda mungkin bisa mendapatkan beberapa wawasan dari demo yang ditautkan.

Semoga itu bisa membantu.

sellmeadog
sumber
2

Berikut contoh lain dalam JavaScript murni: http://jsfiddle.net/eUwMf/

Seperti yang Anda lihat, ideia pada dasarnya sama dengan rebe100x, mendapatkan gambar dari API peta statis Google, dan membaca piksel pertama:

$("#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
sumber
2

Saya akan merekomendasikan menggulung sendiri di sini. Anda dapat menggunakan alat seperti GDAL untuk menanyakan konten di bawah suatu titik dalam sebuah shapefile. Anda bisa mendapatkan shapefile untuk geografi AS dari banyak sumber termasuk Biro Sensus AS .

Ini dapat dilakukan melalui biner GDAL, sumber C, atau melalui swig di Java, Python, dan lainnya.

Peta Sensus

Informasi GDAL

Contoh Point Query dengan Python

TomSchober
sumber
1

Inilah solusi sederhana

Karena Google tidak memberikan hasil yang dapat diandalkan sehubungan dengan koordinat yang terletak di perairan laut atau pedalaman, Anda perlu menggunakan layanan cadangan lain, seperti Yandex, untuk membantu memberikan informasi penting tersebut jika hilang. Anda kemungkinan besar tidak ingin menggunakan Yandex sebagai geocoder utama Anda karena Google jauh lebih unggul dalam keandalan dan kelengkapan data dunia, namun Yandex bisa sangat berguna untuk tujuan mengambil data yang berkaitan dengan koordinat di atas perairan, jadi gunakan keduanya.


Dokumentasi Yandex: https://api.yandex.com.tr/maps/doc/geocoder/desc/concepts/input_params.xml


Langkah-langkah untuk mengambil nama Samudera:

1.) Gunakan Google terlebih dahulu untuk membalikkan geocode koordinat.

2.) Jika Google memberikan hasil nol, kemungkinan 99% koordinatnya terletak di atas lautan. Sekarang buat permintaan geocoding balik sekunder dengan koordinat yang sama ke Yandex. Yandex akan mengembalikan tanggapan JSON dengan untuk koordinat yang tepat, dalam tanggapan ini akan ada dua pasangan "kunci": "nilai" yang penting

["GeoObject"]["metaDataProperty"]["GeocoderMetaData"]["kind"]

and

["GeoObject"]["name"]

Periksa kunci jenis, jika == "hidro" Anda tahu Anda berada di atas perairan, dan karena Google tidak memberikan hasil apa pun, 99,99% kemungkinan badan air ini adalah lautan. Nama lautan akan menjadi kunci "nama" di atas.

Berikut adalah contoh bagaimana saya menggunakan strategi yang ditulis di Ruby

if result.data["GeoObject"]["metaDataProperty"]["GeocoderMetaData"]["kind"] == "hydro"
     ocean = result.data["GeoObject"]["name"] 
end

Langkah-langkah untuk mendapatkan kembali nama Perairan Pedalaman:

Untuk contoh ini, asumsikan koordinat kita terletak di danau di suatu tempat:

1.) Gunakan Google terlebih dahulu untuk membalikkan geocode koordinat.

2.) Google kemungkinan besar akan mengembalikan hasil yang merupakan alamat default yang menonjol di tanah terdekat. Dalam hasil ini, ia memberikan koordinat alamat yang dikembalikannya, koordinat ini tidak akan cocok dengan yang Anda berikan. Ukur jarak antara koordinat yang Anda berikan dan yang dikembalikan dengan hasil, jika sangat berbeda (misalnya 100 yard) kemudian lakukan permintaan cadangan sekunder dengan Yandex dan periksa untuk melihat nilai kunci "jenis", jika itu adalah "hidro" maka Anda tahu koordinatnya terletak pada air. Karena Google mengembalikan hasil yang berlawanan dengan contoh di atas, kemungkinan 99,99% ini adalah perairan pedalaman jadi sekarang Anda bisa mendapatkan namanya. Jika "kind" tidak == "hydro" maka gunakan objek Google geocoded.

["GeoObject"]["metaDataProperty"]["GeocoderMetaData"]["kind"]

and

["GeoObject"]["name"]

Berikut adalah kode yang sama yang ditulis di Ruby untuk mendapatkan inland_body_of_water

if result.data["GeoObject"]["metaDataProperty"]["GeocoderMetaData"]["kind"] == "hydro"
     inland_body_of_water = result.data["GeoObject"]["name"] 
end

Catatan tentang Pemberian Lisensi: Sejauh yang saya tahu, Google tidak mengizinkan Anda menggunakan data mereka untuk ditampilkan di peta lain selain yang ditawarkan Google. Namun Yandex memiliki lisensi yang sangat fleksibel, dan Anda dapat menggunakan datanya untuk ditampilkan di peta Google.

Yandex juga memiliki batas tingkat tinggi 50.000 permintaan / hari gratis, dan tanpa kunci API yang diperlukan.

heading_to_tahiti
sumber
1

Saya berhasil mendapatkan cukup dekat dengan menggunakan Google Elevation API. Berikut gambar hasilnya:

tangkapan layar hasil

Anda melihat segi enam cukup banyak berada di darat meskipun garis keliling persegi panjang ditentukan yang sebagian melewati air. Dalam hal ini saya melakukan pemeriksaan cepat dari Google Maps itu sendiri dan ketinggian minimum di darat sekitar 8-9m jadi itu ambang batas saya. Kode tersebut sebagian besar disalin / ditempel dari dokumentasi Google dan Stack Overflow, berikut inti lengkapnya:

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

dvas0004
sumber
Untuk diketahui, dokumentasi Google Elevation API dapat ditemukan di sini: developers.google.com/maps/documentation/javascript/elevation
dvas0004
2
ini adalah contoh bagus dari kemungkinan penggunaan. tetapi gagal total pada badan air yang terkurung daratan (Lago di garda - Italia dalam contoh gambar yang ditautkan). Kode yang sangat bagus dianggap dapat digunakan sebagai dasar yang mungkin untuk solusi lain!
Obmerk Kronen
1

Jika List<Address>alamat mengembalikan 0, Anda dapat menganggap lokasi ini sebagai lautan atau Sumber Daya Alam. Cukup tambahkan Kode Di Bawah Ini dalam Metode Tanggapan Anda dari Tanggapan API Google Places.

Inisialisasi Daftar Di Bawah seperti yang disebutkan

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{ }

Kumar PG
sumber
0

Sebagai pemula yang lengkap untuk Python, saya tidak bisa mendapatkan solusi SylvainB untuk bekerja dengan skrip python yang memeriksa apakah koordinat ada di darat. Namun saya berhasil mengetahuinya, dengan mengunduh OSGeo4W ( https://trac.osgeo.org/osgeo4w/ ) dan kemudian menginstal semua yang saya butuhkan pip, Ipython, dan memeriksa bahwa semua impor yang ditentukan ada di sana. Saya menyimpan kode berikut sebagai file .py.

Kode untuk memeriksa apakah koordinat ada di darat

###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

Saya mencoba membuatnya berfungsi di R tetapi saya bermimpi buruk mencoba mendapatkan semua paket yang perlu Anda instal jadi terjebak ke python.

Alec Christie
sumber
-3

Saya punya solusi berbeda di sini. Dalam implementasi google map saat ini tidak memperhitungkan arah / jarak dari suatu lokasi perairan ke lokasi daratan dan sebaliknya. Mengapa kita tidak menggunakan logika ini untuk menentukan apakah titiknya adalah tanah atau air.

Misalnya mari kita ambil contoh ini

jika kita ingin menentukan, apakah suatu titik xadalah tanah atau air, maka

mari kita periksa arah antara titik xdan titik yang diketahui yyaitu daratan. Jika menentukan arah / jarak maka titik xadalah daratan atau air.

blganesh101
sumber
Apakah Anda benar-benar mencobanya atau Anda hanya berasumsi, "memasak dari air"?
TMS
Dan bagaimana Anda menangani jembatan? atau terowongan?
Obmerk Kronen