Google Haritalar'da bir noktanın Kara mı yoksa Su mu olduğunu doğrulayın


107

..ve ardından Google haritaları "suları sulardan ayırır"

İncil anlamında değil ama ..

[Enlem, Boylam] noktasının Kara mı yoksa Su mu olduğunu doğrulamak için hangi seçeneklere sahip olduğumu bilmek istiyorum.

Açıkçası Google Haritalar bu verilere sahip (su kütleleri mavi) - ancak API'de bunun için kullanabileceğim bir şey var mı? Ve değilse - hiç düşünmedikleri için mi hizmet etmiyorlar? Veya çok karmaşık olduğu için mi?

Konuyla ilgili herhangi bir bilgi bulamadım - buradaki benzer sorular dışında (arazi türü veya yükseklik bulma gibi - ama tam olarak ihtiyacım olan şey bu değil).

Bunun için ayrı bir katman var mı? Bir seçenek? Komut? Yoksa bunu manuel olarak mı yapmalıyım?

Buna nasıl yaklaşacağımı düşünebilmemin tek yolu (bunu manuel olarak yapmam gerekir mi), sunulan her döşemeyi kesin nokta için kontrol etmek ve ardından o Google harita tonu için RGB değerini kontrol etmektir. Bu sadece teoride - çünkü pratikte - bunu nasıl başaracağım hakkında hiçbir fikrim yok, ilk engel, örneğin bir döşemedeki bir piksel konumunu [LatLon] noktasına nasıl dönüştürebileceğimi bilmememdir.

Hazır bir çözüm çok daha kolay olacaktır.

Dünyadaki TÜM suya ihtiyacım olmadığını unutmayın (örneğin - dereler, küçük göletler, çoğu nehir veya komşunuzun yüzme havuzunu umursamıyorum. Bir kişinin yüzen bir aracın yardımı olmadan girebileceği noktalara ihtiyacım var )

DÜZENLE I

Yorumları okuduktan sonra: Yükseklik yöntemi güvenilir değil, deniz seviyesinin ALTINDA çok fazla yer var (burada http://geology.com/below-sea-level/ "en derin" 10'un bir listesini görebilirsiniz ) ve orada deniz seviyesinin ÜZERİNDE çok fazla karayla çevrili su kütleleri (göller) vardır. Ters coğrafi konum yöntemi güvenilir değildir, çünkü şehir veya eyalet gibi Jeo-politik bir varlığı veya birçok kez SIFIR'ı döndürecektir. Soruyu sormadan önce bu sözde çözümlere zaten baktım - ama aslında hiçbiri soruyu yanıtlamadı - bu yöntemler en iyi ihtimalle kötü "tahmin etme" dir.


1
Yükseklik kitaplığını kullanabilirsiniz. Her zaman doğru olmamakla birlikte, çoğu zaman deniz seviyesindeki su alanında olayların olduğunu hayal ediyorum. Oldukça belirgin bazı köşe vakaları var (Death Valley CA, Hollanda, dağlardaki göller, vb.), Ancak kaba bir yaklaşım için işe yarayabilir.

teşekkürler, bunu zaten düşündüm - ama sizin de belirttiğiniz gibi - yeryüzünde deniz seviyesinin altında çok fazla nokta var - hepsini hariç tutmak uygun bir çözüm değil ..
Obmerk Kronen

@michael - bahsettiğiniz tüm kara kilitli su kütlelerinden bahsetmiyorum bile .. (göller vb.)
Obmerk Kronen

Belki GIS.SE için daha uygun? Ödül sona erdiğinde göç edebilirsiniz.
TMS

Cevabı aldığınız gibi, bu konuda söyleyecek hiçbir şeyim yok .. Ancak, su verileri veya CBS bilgisi arıyorsanız, ayrı alan adımız olan http://gis.stackexchange.com/ Burada ayrı bir tartışma devam ediyor. , su verileri de dahil olmak üzere ihtiyaç duyabileceğiniz birçok şeyi bulacaksınız .. bu durumda size yardımcı olacak .. (gerekirse ..) Eski Gönderi Umarım bu yardımcı olur ..
MarmiK

Yanıtlar:


55

Bunlar 2 farklı yol, deneyebilirsiniz:

  • Google Haritalar Ters Coğrafi Kodlamayı kullanabilirsiniz . Sonuç kümesinde su olup olmadığını kontrol ederek belirleyebilirsiniz types. Su durumunda tiptir natural_feature. Http://code.google.com/apis/maps/documentation/geocoding/#Types bu bağlantıda daha fazlasını görün .

    Ayrıca, Sea, Lake, Oceandaha fazla doğruluk için özelliklerin adlarını, içeriyorsa ve sularla ilgili diğer bazı kelimeleri kontrol etmeniz gerekir . Örneğin çöller de natural_features.

    Artıları - Tüm tespit işlemleri müşterinin makinesinde yapılacaktır. Kendi sunucu tarafı hizmetini oluşturmaya gerek yok.

    Eksileri - Çok yanlış ve sularda "hiç" elde etme şansınız çok yüksek.

  • Google Statik Haritaları kullanarak suları / karaları piksellere göre tespit edebilirsiniz . Ancak bunun için http hizmeti oluşturmanız gerekir.

    Hizmetinizin gerçekleştirmesi gereken adımlar şunlardır:

    1. Alma latitude, longitudeve current zoommüşteriden.
    2. Gönder http://maps.googleapis.com/maps/api/staticmap?center={enlem ,boylam }&zoom={akım zoom`} & size = 1x1 & maptype = yol haritası & sensörü = Google Static Map hizmetine sahte isteği.
    3. Pikselin 1x1 statik görüntü rengini algılayın.
    4. Algılama ile ilgili bir bilgiyi yanıtlayın.

    İstemci tarafında pikselin rengini tespit edemezsiniz. Evet, istemcinin makinesine statik imaj yükleyebilir ve canvaselement üzerine resim çizebilirsiniz . Ancak getImageDatapikselin rengini elde etmek için tuvalin bağlamını kullanamazsınız . Bu, alanlar arası politika ile sınırlandırılmıştır.

    Prons - Son derece doğru algılama

    Eksileri - Algılama için kendi sunucu kaynaklarının kullanılması


2
Teşekkürler - zaten kontrol ettim - Türlerin Sea Lake Ocean'ı ve benzerlerini çevirdiğini bilmiyordum ve düzenlemenizde belirttiğiniz gibi - natural_feature aynı zamanda bir dağ, bir ada ve bir çöl olabilir .. Belki yapabilir misiniz? bir belgeye işaret ediyor musunuz? ayrıca - adresi olmayan yerler için nasıl ters coğrafi kodlama yapabilirsiniz? ve jeoploitik bir varlığın parçası olan bir göle ne dersiniz? Bir şehir veya belediye sınırının İÇİNDEKİ bir göl gibi (örneğin, genevre) veya sadece bir şehir limanının İÇİNDEKİ bir nokta. Denemelerimde bunu yapamadım ..
Obmerk Kronen

3
Dünyadaki suyun çoğu için, ters coğrafi kodlama "sıfır sonuç" döndürecektir, coğrafi kodlama aracına bakın: gmaps-samples-v3.googlecode.com/svn/trunk/geocoder/… ve okyanusun içinde bir yeri tıklayın.
Dr.Molle

@Tomas - diğer "istifleyiciler" için yaratılmamış veya saygısız olmak istemiyorum - ama belki de geçerli / doğru bir yöntem olmadığı için oylanmıyor?
Obmerk Kronen

3
Statik Haritaları önerilen şekilde kullanmak, muhtemelen Koşulları (10.1.1 (h)) ihlal eder .
Andrew Leach

1
Statik Haritalar yaklaşımına gelince, bunu stil Developers.google.com/maps/documentation/static-maps/… ile yapabilirsiniz, ancak Saurav bağlantılı makaleyi de kullanabilirsiniz.
miguev

19

Mevcut herhangi bir Google hizmetiyle bu mümkün görünmüyor.

Ancak Koordinates Vector JSON Sorgu hizmeti gibi başka hizmetler de var ! Sadece URL'deki verileri sorguluyorsunuz ve bir JSON / XML yanıtı alıyorsunuz .

Örnek istek: 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

Anahtarınızı ve seçtiğiniz katman numarasını kaydetmeniz ve sağlamanız gerekir. Mevcut katmanların tüm depolarında arama yapabilirsiniz . Katmanların çoğu yalnızca bölgeseldir, ancak Dünya Sahil Şeridi gibi küresel de bulabilirsiniz :

görüntü açıklamasını buraya girin

Bir katman seçtiğinizde, "Hizmetler" sekmesini tıklarsınız, örnek istek URL'sini alırsınız. Sadece kayıt olmanız gerektiğine inanıyorum ve hepsi bu!

Ve şimdi en iyisi:

Katmanınızı yükleyebilirsiniz!

Şu anda mevcut değil, onu bir şekilde işlemek zorundasın, ama çalışmalı! Katman deposu, gerçekte insanlar onları ihtiyaç duydukça yüklemiş gibi görünüyor.


bu neredeyse mükemmel görünüyor, ancak Okyanusya'ya ait olmayan herhangi bir yerel harita göremiyorum. ABD katmanları var mı?
HaloWebMaster

@HaloWebMaster bahsettiğim katman küresel. Ayrıca katmanları bölgeye göre de arayabilirsiniz.
TMS

@HaloWebMaster Kendi katmanınızı yükleyebileceğinizi fark ettim! Güncellememe bakın.
TMS

Hey, Tomas, ödülü gerçekten alıp almadığını bilmiyorum (bir haftadır çevrim dışı olduğum için) ama bu harika! Yardımınız için teşekkür ederim, başvurumu işe alamazdım. Teşekkürler! (Ödülü almadıysanız, tekrar ödüllendiririm, sadece bana PM)
HaloWebMaster

Hey, beni bir haftalık özel kodlamadan kurtardın! Buna değer!
HaloWebMaster

8

Kullandığım bu ve fena değil ... Eğer israf edecek daha fazla cpu varsa, piksel ekleyerek testi iyileştirebilirsiniz.

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

Kod, yeni sürümde çalışmaz. ($ Red == 537 && $ green == 627 && $ blue == 765)
Wim Pruiksma

8

Onwater.io adlı bu sorunu tam olarak çözen ücretsiz bir web API var . Bu, Google haritalarında yerleşik bir şey değildir, ancak bir enlem ve boylam verildiğinde, bir alma isteği aracılığıyla doğru veya yanlış olarak döndürülür.

Su örneği: https://api.onwater.io/api/v1/results/23.92323,-66.3

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

Karadaki örnek: https://api.onwater.io/api/v1/results/42.35,-71.1

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

Tam açıklama onwater'ın arkasındaki şirket olan Dockwa.com'da çalışıyorum. Bu sorunu kendimiz çözmek ve topluma yardım etmek için su üzerinde inşa ettik. Kullanımı ücretsiz (yüksek hacim için ödenir) ve paylaşmak istedik :)


1
Güncellenen Örnek Bağlantılar: Su Örneği: api.onwater.io/api/v1/results/23.92323,-66.3 Arazi Örneği: api.onwater.io/api/v1/results/42.35,-71.1
Christian K.

1
Artık ücretsiz değil (daha yüksek hacimler için), ancak işi yaparsa hala çok uygun!
Christian K.

Dokümantasyon sayfası bir hata veriyor. Kapsama özgü herhangi bir veri olup olmadığını kontrol etmek istedim. Yani hangi ülkeleri kapsıyorsunuz?
nr5

Onwater.io göller ve nehirler için çalışıyor mu? Öyleyse, türle ilgili bir gösterge alır mıyım?
luksch

7

Bu sorguyu yerel olarak yapmanın daha ilginç olduğunu düşündüm, böylece kendime daha fazla güvenebilirim: Diyelim ki bir kerede 25000 rastgele arazi koordinatı oluşturmak istiyorum, muhtemelen maliyetli harici API'lere yapılan çağrılardan kaçınmayı tercih ederim. İşte TomSchober tarafından bahsedilen python örneğini kullanarak python'da buna şansım. Temel olarak , tüm arazi koordinatlarını içeren önceden hazırlanmış bir 350MB dosyasında koordinatları arar ve koordinatlar orada mevcutsa, onları yazdırır.

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)

Bir düzine koordinat denedim, harika çalışıyor. "Land_polygons.shp" dosyası , OpenStreetMaps'in övgüleriyle buradan indirilebilir . (İlk WGS84 indirme bağlantısını kendim kullandım, belki ikincisi de çalışıyor)


Ya göller? Göllerdeki noktaları deniz mi kara olarak mı görüyor?
fatma.ekici

İyi soru! Sayfada cevabımda bağlantılı olan OpenStreetMaps verilerini kontrol ettim ve lands dosyasının değerlerini etikete dayandırdığını söylüyor natural=coastline. Hızlı bir googling, özellikle kıyı şeridi etiketlerinin isimlendirmelerinde göller için geçerli olmadığını belirten bu sayfayı kullanır . Söyleyebilirm Yani hiçbir benim yöntem yapar değil kullanıyorum veri kümesi değil, çünkü su gibi gölleri belirlemek. Ama kendiniz deneyin!
SylvainB

7

Bu makaleye göz atın . Bir sunucuya ihtiyaç duymadan suda bir şey olup olmadığını doğru bir şekilde algılar. Bu, Google Haritalar'daki özel stil özelliğine dayanan bir hack.


5

Ters coğrafi kodlamaya ek olarak - Dr Molle'nin belirttiği gibi, SIFIR_RESULTS döndürebilir - Yükseklik hizmetini kullanabilirsiniz. Ters coğrafi kodlama ile sıfır sonuç alırsanız, konumun yüksekliğini alın. Genellikle deniz tabanı deniz seviyesinin altında olduğundan deniz negatif bir sayı alır. Yükseltme hizmetinin tam olarak çalışılmış bir örneği var .

Google bu bilgileri başka herhangi bir yöntemle kullanıma sunmadığı için yalnızca bir tahmin olduğunu ve tahminlerin doğası gereği yanlış olduğunu unutmayın. Bununla birlikte type, ters coğrafi kodlama ile döndürülen veya typemevcut değilse yükselti kullanılması çoğu olasılığı kapsayacaktır.


Cevabınız ve örnek bağlantı için teşekkürler (BTW - benim için Opera'da çalışmıyor) - ancak kara ve negatif olan tüm alanları gerçekten görmezden gelemem ve deneylerim TYPE'ın güvenilir olmadığını gösterdi - ve çoğu zaman geri dönüyor yakın bir jeopolitik varlık. daha kesin bir yöntem olmalı - "tahmin etmek" burada doğru yaklaşım gibi görünmüyor. TİP güvenilir olsaydı - En iyi çözüm olurdu - ama değil ... ve deniz seviyesinin
ÜZERİNDEKİ

3

Bu yöntem tamamen güvenilmezdir. Aslında, döndürülen veriler tamamen dünyanın hangi kısmıyla çalıştığınıza bağlı olacaktır. Mesela ben Fransa'da çalışıyorum. Fransa sahilindeki denizi tıklarsam, Google "tahmin edebileceği" en yakın ARAZİ konumunu döndürür. Aynı soru için Google'dan bilgi istediğimde, bir su kütlesinde istenen noktayı doğru bir şekilde iade edemediklerini söylediler.

Pek tatmin edici bir cevap değil, biliyorum. Bu, özellikle kullanıcıya bir işaretçi konumu tanımlamak için haritayı tıklama yeteneği sağlayan bizler için oldukça sinir bozucu.


1
Katılıyorum - @ user1113426 ve @Andrew Leach tarafından önerilen yöntemler gerçekten yöntem değildir. Kullanıcılara "mavi alanlara tıklamayın" demek daha iyidir :-) ama cidden - Google'ın böyle bir işlevi serbest bırakmak istememesine çok şaşırdım - yaklaşık olsa bile - bu "yaklaşımdan" daha iyidir şimdi var - bu sizin işaretçi gibi - bazen yüzlerce metre ötedeki bir konuma "takılıyor". Önerilen yöntemim bile daha doğru (çok kötü, bunu nasıl başaracağım hakkında hiçbir fikrim yok.)
Obmerk Kronen

3

Her şey başarısız olursa, her zaman noktada ve yaklaşık bir mesafe için yüksekliği kontrol etmeyi deneyebilirsiniz - su dışındaki pek çok şey tamamen düz olma eğiliminde değildir.


teşekkürler, bu güzel bir fikir, ama her şelalede veya bir nehir kanyonunda olağanüstü bir şekilde başarısız olur ...
Obmerk Kronen

2

Maalesef bu cevap Google Haritalar API'sinde değil ve başvurulan kaynak ücretsiz değil, ancak DynamicGeometry tarafından sağlanan, GetWaterOrLandenlem / boylam çiftini kabul eden bir işlemi ortaya çıkaran bir web hizmeti var ( burada bir demo görebilirsiniz ).

Bunun nasıl uygulandığına dair anlayışım su kütlesi şekil dosyalarını kullanarak. Bu şekil dosyalarının Google Maps API ile tam olarak nasıl kullanıldığı, ancak bağlantılı demodan biraz bilgi edinebilirsiniz.

Umarım bu bir şekilde yardımcı olur.


2

İşte saf JavaScript'te başka bir örnek: http://jsfiddle.net/eUwMf/

Gördüğünüz gibi ideia, temelde rebe100x ile aynıdır, görüntüyü Google statik harita API'sinden alır ve ilk pikseli okuyun:

$("#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");
    }
});



1

İşte basit bir çözüm

Google, okyanus ya da iç su kütlelerinde bulunan koordinatlarla ilgili güvenilir sonuçlar sağlamadığından, eksik olduğunda bu kritik bilgileri sağlamaya yardımcı olmak için Yandex gibi başka bir yedekleme hizmeti kullanmanız gerekir. Büyük olasılıkla Yandex'i birincil coğrafi kodlayıcınız olarak kullanmak istemezsiniz çünkü Google, dünya verilerinin güvenilirliği ve eksiksizliği konusunda çok daha üstündür, ancak Yandex, su kütleleri üzerindeki koordinatlarla ilgili olduğunda verileri almak için çok yararlı olabilir. bu yüzden ikisini de kullanın.


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


Okyanus adını alma adımları:

1.) Koordinatın coğrafi kodunu ters çevirmek için önce Google'ı kullanın.

2.) Google sıfır sonuç döndürürse, koordinatın bir okyanus üzerinde olması% 99 olasıdır. Şimdi Yandex'e aynı koordinatlarla ikincil bir ters coğrafi kodlama talebinde bulunun. Yandex, tam koordinatlar için JSON yanıtı döndürecektir, bu yanıt içinde iki "anahtar": "değer" önem çifti olacaktır

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

and

["GeoObject"]["name"]

Tür anahtarını kontrol edin, eğer it == "hydro" bir su kütlesinin üzerinde olduğunuzu biliyorsanız ve Google sıfır sonuç verdiği için bu su kütlesinin bir okyanus olma olasılığı% 99.99'dur. Okyanusun adı yukarıdaki "ad" anahtarı olacaktır.

Ruby'de yazılmış bu stratejiyi nasıl kullandığımın bir örneği burada

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

Bir İç Su Gövdesi adını alma adımları:

Bu örnek için koordinatımızın bir yerde bir gölde olduğunu varsayalım:

1.) Koordinatın coğrafi kodunu ters çevirmek için önce Google'ı kullanın.

2.) Google büyük olasılıkla yakındaki bir arazide göze çarpan bir varsayılan adres olan bir sonuç döndürecektir. Bu sonuçta döndürdüğü adresin koordinatlarını sağlar, bu koordinat verdiğiniz koordinatla eşleşmeyecektir. Sağladığınız koordinat ile sonuçla döndürülen koordinat arasındaki mesafeyi ölçün, önemli ölçüde farklıysa (örneğin 100 yarda), ardından Yandex ile ikincil bir yedekleme isteği gerçekleştirin ve eğer varsa "tür" anahtarının değerini kontrol edin "hidro" ise koordinatın su üzerinde olduğunu bilirsiniz. Google, yukarıdaki örneğin aksine bir sonuç döndürdüğü için, bunun bir iç su kütlesi olma olasılığı% 99,99'dur, bu nedenle şimdi adı alabilirsiniz. "Tür" == "hidro" değilse, Google'ın coğrafi kodlu nesnesini kullanın.

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

and

["GeoObject"]["name"]

Inland_body_of_water almak için Ruby'de yazılan kodun aynısı burada

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

Lisanslama hakkında bir not: Bildiğim kadarıyla Google, verilerini Google'ın sunduğu haritalarda görüntülenmek üzere kullanmanıza izin vermiyor. Ancak Yandex'in çok esnek bir lisansı vardır ve verilerini Google haritalarında görüntülemek için kullanabilirsiniz.

Ayrıca Yandex'in 50.000 istek / gün gibi yüksek bir oran sınırı vardır ve API anahtarı gerekmez.


1

Google Elevation API'yi kullanarak oldukça yaklaşmayı başardım. İşte sonuçların bir görüntüsü:

sonuçların ekran görüntüsü

Kısmen suyun üzerine uzanan dikdörtgen bir çevre tanımlanmış olsa da altıgenlerin karada kaldığını görüyorsunuz. Bu durumda, Google Haritalar'ın kendisinden hızlı bir kontrol yaptım ve karadaki minimum yükseklik 8-9m civarındaydı ve bu benim eşiğimdi. Kod çoğunlukla Google dokümantasyonundan ve Stack Overflow'dan kopyalanır / yapıştırılır, işte tam öz:

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


Bilginize, Google Elevation API dokümantasyonuna buradan ulaşabilirsiniz: developers.google.com/maps/documentation/javascript/elevation
dvas0004

2
bu, olası kullanımın harika bir örneğidir. ancak kara kilitli su kütlelerinde görkemli bir şekilde başarısız olacaktır (bağlantılı resim örneğinde Lago di garda - İtalya). Başka bir çözüm için olası bir temel olarak kullanılması düşünülen çok güzel bir kod!
Obmerk Kronen

1

Eğer List<Address> adres döner 0, Your tepki Google Rehber API Tepki Yöntemi içinde Kanununun Aşağıda okyanus ya Doğal Resources.Just eklenti olarak bu konumu varsayabiliriz.

Aşağıdaki Listeyi belirtildiği gibi başlat

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'da tam bir acemi olarak SylvainB'nin çözümünü koordinatların karada olup olmadığını kontrol eden python betiğiyle çalışacak şekilde alamadım. Ancak OSGeo4W ( https://trac.osgeo.org/osgeo4w/) indirerek bunu çözmeyi başardım ) ve ardından ihtiyacım olan her şeyi pip, Ipython yükleyerek ve belirtilen tüm ithalatların orada olduğunu kontrol ederek bunu çözmeyi başardım. Aşağıdaki kodu bir .py dosyası olarak kaydettim.

Koordinatların karada olup olmadığını kontrol etmek için kod

###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'de çalışmasını sağlamaya çalıştım ama kurmanız gereken tüm paketleri python'a yapışmış halde almaya çalışırken bir kabus gördüm.


-3

Burada farklı bir çözümüm var. Mevcut google harita uygulamasında, bir su konumundan kara konumuna ve tersi yönde yön / mesafeyi hesaplamaz. Neden noktanın kara mı yoksa su mu olduğunu belirlemek için bu mantığı kullanmıyoruz.

Örneğin bu örneği ele alalım

Bir noktanın xkara mı yoksa su mu olduğunu belirlemek istiyorsak , o zaman

nokta xile bilinen bir nokta yolan kara arasındaki yönü kontrol edelim . Yönü / mesafeyi belirlerse, nokta xkara ya da sudur.


Gerçekten denediniz mi yoksa "sudan yemek pişirmek" mi varsayıyorsunuz?
TMS

Ve köprüleri nasıl idare edeceksiniz? veya tüneller?
Obmerk Kronen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.