..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".
sumber
Jawaban:
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 adalahnatural_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, Ocean
dan beberapa kata lain yang terkait dengan perairan untuk lebih akurat. Misalnya gurun juga adalahnatural_feature
s.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:
latitude
,longitude
dancurrent zoom
dari klien.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.Anda tidak dapat mendeteksi warna piksel di sisi klien. Ya, Anda dapat memuat gambar statis pada mesin klien dan menggambar gambar pada
canvas
elemen. Tetapi Anda tidak dapat menggunakangetImageData
konteks kanvas untuk mendapatkan warna piksel. Ini dibatasi oleh kebijakan lintas domain.Prons - Deteksi yang sangat akurat
Kontra - Penggunaan sumber daya server sendiri untuk deteksi
sumber
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 .
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 :
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.
sumber
Ini yang saya gunakan dan berfungsi tidak terlalu buruk ... Anda dapat meningkatkan pengujian jika Anda memiliki lebih banyak cpu untuk dibuang dengan menambahkan piksel.
sumber
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
Contoh di darat: https://api.onwater.io/api/v1/results/42.35,-71.1
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 :)
sumber
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.
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)
sumber
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!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.
sumber
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
type
geocoding balik yang dikembalikan, atau ketinggian jikatype
tidak tersedia, akan mencakup sebagian besar kemungkinan.sumber
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.
sumber
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.
sumber
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
GetWaterOrLand
yang 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.
sumber
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:
sumber
Lihat jawaban yang saya berikan untuk pertanyaan serupa - menggunakan "HIT_TEST_TERRAIN" dari Earth Api untuk mencapai fungsinya.
Ada contoh kerja dari ide yang saya kumpulkan di sini: http://www.msa.mmu.ac.uk/~fraser/ge/coord/
sumber
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
sumber
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
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
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.
Berikut adalah kode yang sama yang ditulis di Ruby untuk mendapatkan inland_body_of_water
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.
sumber
Saya berhasil mendapatkan cukup dekat dengan menggunakan Google Elevation API. Berikut gambar hasilnya:
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
sumber
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{ }
sumber
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
Saya mencoba membuatnya berfungsi di R tetapi saya bermimpi buruk mencoba mendapatkan semua paket yang perlu Anda instal jadi terjebak ke python.
sumber
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
x
adalah tanah atau air, makamari kita periksa arah antara titik
x
dan titik yang diketahuiy
yaitu daratan. Jika menentukan arah / jarak maka titikx
adalah daratan atau air.sumber