Überprüfen Sie in Google Maps, ob ein Punkt Land oder Wasser ist


106

..und dann Google-Maps "trenne das Wasser vom Wasser"

Nun, nicht im biblischen Sinne, aber ..

Ich würde gerne wissen, welche Optionen ich habe, um zu überprüfen, ob ein Punkt von [Lat, Lon] Land oder Wasser ist.

Google Maps hat offensichtlich diese Daten (die Gewässer sind blau) - aber gibt es etwas in der API, das ich dafür verwenden kann? Und wenn nicht - dienen sie es nicht, weil sie nie daran gedacht haben? Oder weil es zu kompliziert ist?

Ich habe keine Informationen zu diesem Thema gefunden - außer einigen ähnlichen Fragen hier (wie das Finden des Geländetyps oder der Höhe - aber es ist nicht genau das, was ich brauche).

Gibt es dafür eine getrennte Schicht? Eine Option? Befehl? Oder sollte ich das manuell machen?

Die einzige Möglichkeit, wie ich dies angehen kann (sollte ich dies manuell tun müssen), besteht darin, jede bereitgestellte Kachel auf den genauen Punkt zu überprüfen - und dann den RGB-Wert für diesen Google-Kartenfarbton zu überprüfen. Dies ist nur theoretisch - weil ich in der Praxis keine Ahnung habe, wie ich das erreichen soll. Das erste Hindernis ist, dass ich nicht weiß, wie ich beispielsweise eine Pixelposition auf einer Kachel in einen [LatLon] -Punkt konvertieren kann

Eine fertige Lösung wäre viel einfacher.

Beachten Sie, dass ich nicht ALLES Wasser der Welt brauche (zum Beispiel - Bäche, kleine Teiche, die meisten Flüsse oder das Schwimmbad Ihres Nachbarn interessieren mich nicht. Ich brauche die Punkte, an denen sich eine Person ohne die Hilfe eines schwimmenden Fahrzeugs wagen kann )

BEARBEITEN I.

Nach dem Lesen von Kommentaren: Die Höhenmethode ist nicht zuverlässig, es gibt zu viele Orte UNTER dem Meeresspiegel (eine Liste der "tiefsten" 10 finden Sie hier http://geology.com/below-sea-level/ ) und dort Es gibt zu viele Binnengewässer ÜBER dem Meeresspiegel (Seen). Die umgekehrte Geolokalisierungsmethode ist nicht zuverlässig, da sie eine geopolitische Einheit wie eine Stadt oder einen Staat - oder NULL - viele Male zurückgibt. Ich habe diese Pseudolösungen bereits untersucht, bevor ich die Frage gestellt habe - aber keiner von ihnen hat die Frage tatsächlich beantwortet -, diese Methoden sind bestenfalls schlecht "erraten".


1
Möglicherweise können Sie die Höhenbibliothek verwenden. Obwohl dies nicht immer zutrifft, stelle ich mir vor, dass die meisten Dinge auf Meereshöhe Wasser sind. Es gibt einige ziemlich offensichtliche Eckfälle (Death Valley CA, Niederlande, Seen in Bergen usw.), aber es könnte für eine grobe Annäherung funktionieren.

danke, ich habe bereits darüber nachgedacht - aber wie Sie bereits betont haben - es gibt zu viele Punkte unter dem Meeresspiegel auf der Erde - es ist keine praktikable Lösung, alle auszuschließen.
Obmerk Kronen

@ Michael - ganz zu schweigen von all den Binnengewässern, die Sie erwähnt haben .. (Seen usw.)
Obmerk Kronen

Vielleicht besser für GIS.SE geeignet? Sie können migrieren, wenn das Kopfgeld endet.
TMS

Da Sie eine Antwort erhalten haben, habe ich dazu nichts zu sagen. Wenn Sie jedoch nach Wasserdaten oder GIS-Informationen suchen, finden Sie auf unserer separaten Domain http://gis.stackexchange.com/ hier eine separate Diskussion , finden Sie viele Dinge, die Sie möglicherweise benötigen, einschließlich Wasserdaten .. die Ihnen für den Fall helfen .. (falls erforderlich ..) Alter Beitrag Ich hoffe, dies wird helfen ..
MarmiK

Antworten:


55

Dies sind zwei verschiedene Möglichkeiten, die Sie ausprobieren können:

  • Sie können die umgekehrte Geokodierung von Google Maps verwenden . In der Ergebnismenge können Sie durch Überprüfen feststellen, ob es sich um Wasser handelt types. In Gewässern ist der Typ natural_feature. Weitere Informationen finden Sie unter diesem Link http://code.google.com/apis/maps/documentation/geocoding/#Types .

    Außerdem müssen Sie die Namen der Features überprüfen, wenn sie Sea, Lake, Oceanund einige andere Wörter im Zusammenhang mit Gewässern enthalten, um eine genauere Darstellung zu erhalten. Zum Beispiel sind die Wüsten auch natural_features.

    Vorteile - Der gesamte Erkennungsprozess wird auf dem Computer des Kunden durchgeführt. Es ist nicht erforderlich, einen eigenen serverseitigen Dienst zu erstellen.

    Nachteile - Sehr ungenau und die Wahrscheinlichkeit, dass Sie in Gewässern "keine" bekommen, ist sehr hoch.

  • Mithilfe von Google Static Maps können Sie Wasser / Land anhand von Pixeln erkennen . Zu diesem Zweck müssen Sie jedoch einen http-Dienst erstellen.

    Dies sind die Schritte, die Ihr Dienst ausführen muss:

    1. Empfangen latitude, longitudeundcurrent zoom von Kunden.
    2. Senden http://maps.googleapis.com/maps/api/staticmap?center={Breitengrad ,Längengrad}&zoom={ Aktueller Zoom`} & size = 1x1 & maptype = Roadmap & sensor = falsche Anfrage an den Google Static Map-Dienst.
    3. Erkennen Sie die Pixelfarbe eines statischen 1x1-Bildes.
    4. Antworten Sie auf Informationen zur Erkennung.

    Sie können die Farbe des Pixels auf der Clientseite nicht erkennen. Ja, Sie können ein statisches Image auf den Computer des Clients laden und ein Image auf ein canvasElement zeichnen . Sie können den getImageDataCanvas-Kontext jedoch nicht zum Abrufen der Pixelfarbe verwenden. Dies wird durch domänenübergreifende Richtlinien eingeschränkt.

    Prons - Hochgenaue Erkennung

    Nachteile - Verwendung eigener Serverressourcen zur Erkennung


2
Danke - ich habe es bereits überprüft - ich wusste nicht, dass die Typen Sea Lake Ocean und dergleichen drehen, und wie Sie in Ihrer Bearbeitung gezeigt haben - natural_feature wäre auch ein Berg, eine Insel und eine Wüste. Können Sie vielleicht auf eine Dokumentation verweisen? auch - wie können Sie eine umgekehrte Geokodierung für Orte ohne Adressen durchführen? und was ist mit einem See, der Teil einer geoploitischen Einheit ist? wie ein See INNERHALB einer Stadt- oder Gemeindegrenze (zum Beispiel Genf) oder einfach ein Punkt, der INNERHALB eines Stadthafens liegt. In meinen Versuchen habe ich das Gefühl, dies zu tun.
Obmerk Kronen

3
Für den größten Teil des Wassers der Welt liefert eine umgekehrte Geokodierung "Null-Ergebnisse". Schauen Sie sich das Geokodierungs-Tool an: gmaps-samples-v3.googlecode.com/svn/trunk/geocoder/… und klicken Sie irgendwo in einem Ozean.
Dr.Molle

@Tomas - nicht, dass ich für andere "Stapler" unkompliziert oder respektlos sein möchte - aber vielleicht wird es nicht gewählt, weil es keine gültige / genaue Methode ist?
Obmerk Kronen

3
Die Verwendung von statischen Karten in der vorgeschlagenen Weise würde wahrscheinlich als Verstoß gegen die Bedingungen (10.1.1 (h)) angesehen.
Andrew Leach

1
Der Ansatz für statische Karten kann mit style developer.google.com/maps/documentation/static-maps/… durchgeführt werden. Sie können jedoch auch den mit Saurav verknüpften Artikel verwenden.
Miguev

19

Mit einem aktuellen Google-Dienst scheint dies nicht möglich zu sein.

Es gibt aber auch andere Dienste, wie den Koordinates Vector JSON Query-Dienst ! Sie fragen einfach die Daten in der URL ab und erhalten eine JSON / XML-Antwort zurück .

Beispielanforderung: 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

Sie müssen sich registrieren und Ihren Schlüssel und die ausgewählte Layernummer angeben. Sie können das gesamte Repository der verfügbaren Ebenen durchsuchen . Die meisten Schichten sind nur regional, aber Sie können auch global finden, wie die Weltküste :

Geben Sie hier die Bildbeschreibung ein

Wenn Sie eine Ebene auswählen, klicken Sie auf die Registerkarte "Dienste" und Sie erhalten die Beispielanforderungs-URL. Ich glaube, Sie müssen sich nur registrieren und das war's!

Und jetzt das Beste:

Sie können Ihre Ebene hochladen!

Es ist nicht sofort verfügbar, hey muss es irgendwie verarbeiten, aber es sollte funktionieren! Das Layer-Repository sieht tatsächlich so aus, als hätten die Benutzer sie nach Bedarf hochgeladen.


das sieht fast perfekt aus, aber ich sehe keine lokalen Karten, die nicht von Ozeanien sind. Gibt es US-Schichten?
HaloWebMaster

@HaloWebMaster Die Ebene, die ich erwähnt habe, ist global. Sie können die Ebenen auch nach Regionen durchsuchen.
TMS

@HaloWebMaster Mir ist gerade aufgefallen, dass du deine eigene Ebene hochladen kannst! Siehe mein Update.
TMS

Hey, Tomas, ich weiß nicht, ob du tatsächlich das Kopfgeld bekommen hast oder nicht (da ich eine Woche offline war), aber das ist großartig! Vielen Dank für Ihre Hilfe, ich hätte meine Bewerbung nicht zum Laufen bringen können. Vielen Dank! (Wenn Sie das Kopfgeld nicht erhalten haben, werde ich es erneut belohnen, schreiben Sie mir einfach eine PM)
HaloWebMaster

Hey, du hast mir eine Woche benutzerdefinierte Codierung erspart! Das ist es wert!
HaloWebMaster

8

Das, was ich benutze und es funktioniert nicht schlecht ... Sie können den Test verbessern, wenn Sie mehr CPU verschwenden müssen, indem Sie Pixel hinzufügen.

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

Code funktioniert nicht mit neuer Version. Neue Version sollte so sein, wenn ($ red == 537 && $ green == 627 && $ blue == 765)
Wim Pruiksma

8

Es gibt eine kostenlose Web-API namens onwater.io , die genau dieses Problem löst . Es ist nicht in Google Maps integriert, aber bei einem Längen- und Breitengrad wird über eine Abrufanforderung genau wahr oder falsch zurückgegeben.

Beispiel für Wasser: https://api.onwater.io/api/v1/results/23.92323,-66.3

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

Beispiel an Land: https://api.onwater.io/api/v1/results/42.35,-71.1

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

Vollständige Offenlegung Ich arbeite bei Dockwa.com , dem Unternehmen hinter onwater. Wir haben auf dem Wasser gebaut, um dieses Problem selbst zu lösen und der Gemeinde zu helfen. Es ist kostenlos zu benutzen (für hohes Volumen bezahlt) und wir wollten teilen :)


1
Aktualisierte Beispiellinks: Wasser Beispiel: api.onwater.io/api/v1/results/23.92323,-66.3 Land Beispiel: api.onwater.io/api/v1/results/42.35,-71.1
Christian K.

1
Es ist nicht mehr kostenlos (für höhere Stückzahlen), aber wenn es den Job macht, ist es immer noch sehr erschwinglich!
Christian K.

Die Dokumentationsseite gibt einen Fehler aus. Ich wollte überprüfen, ob es abdeckungsspezifische Daten gibt. Ich meine, welche Länder decken Sie ab?
Nr. 5

Funktioniert onwater.io für Seen und Flüsse? Wenn ja, bekomme ich eine Angabe des Typs?
Luksch

7

Ich fand es interessanter, diese Abfrage lokal durchzuführen, damit ich unabhängiger sein kann: Nehmen wir an, ich möchte 25000 zufällige Landkoordinaten gleichzeitig generieren, ich möchte lieber Aufrufe möglicherweise kostspieliger externer APIs vermeiden. Hier ist meine Aufnahme in Python anhand des von TomSchober erwähnten Python-Beispiels . Grundsätzlich werden die Koordinaten in einer vorgefertigten 350-MB-Datei nachgeschlagen, die alle Landkoordinaten enthält, und wenn die Koordinaten dort vorhanden sind, werden sie gedruckt.

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)

Ich habe ein Dutzend Koordinaten ausprobiert, es funktioniert wunderbar. Die Datei "land_polygons.shp" kann hier heruntergeladen werden , ein Kompliment von OpenStreetMaps. (Ich habe den ersten WGS84-Download-Link selbst verwendet, vielleicht funktioniert auch der zweite)


Was ist mit Seen? Betrachtet es Punkte auf Seen als Meer oder Land?
fatma.ekici

Gute Frage! Ich habe auf der Seite nach den OpenStreetMaps-Daten gesucht, die in meiner Antwort verlinkt waren , und es heißt, dass die Länderdatei ihre Werte auf dem Tag basiert natural=coastline. Beim schnellen Googeln wird diese Seite verwendet, auf der ausdrücklich angegeben ist, dass Küstenmarkierungen in ihrer Nomenklatur nicht für Seen gelten. Also ich würde sagen , nein , meine Methode ist nicht identifizieren Seen wie Wasser, da der Datensatz verwende ich nicht. Aber probieren Sie es selbst aus!
SylvainB

7

Kasse diesen Artikel . Es erkennt genau, ob sich etwas auf dem Wasser befindet, ohne dass ein Server erforderlich ist. Es ist ein Hack, der auf der benutzerdefinierten Styling-Funktion in Google Maps basiert.


5

Zusätzlich zur umgekehrten Geokodierung - wie Dr. Molle hervorgehoben hat, kann ZERO_RESULTS zurückgegeben werden - können Sie den Elevation-Dienst verwenden. Wenn Sie durch umgekehrte Geokodierung keine Ergebnisse erhalten, ermitteln Sie die Höhe des Standorts. Im Allgemeinen erhält das Meer eine negative Zahl, da der Meeresboden unter dem Meeresspiegel liegt. Es gibt ein vollständig ausgearbeitetes Beispiel für den Höhendienst.

Beachten Sie, dass Google diese Informationen nicht zur Verfügung stellt. Jede andere Methode ist nur eine Vermutung und Vermutungen sind von Natur aus ungenau. Die Verwendung der typedurch umgekehrte Geokodierung zurückgegebenen oder der Höhe, falls typenicht verfügbar, deckt jedoch die meisten Eventualitäten ab.


Vielen Dank für Ihre Antwort und den Beispiellink (übrigens - es funktioniert in Opera nicht für mich) - aber ich kann nicht alle Gebiete ignorieren, die land- und negativ sind, und meine Experimente haben gezeigt, dass der TYP nicht zuverlässig ist - und oft zurückkehrt eine nahe gelegene geopolitische Einheit. Es muss eine genauere Methode geben - "Raten" scheint hier nicht der richtige Ansatz zu sein. Wenn der TYP zuverlässig wäre - es wäre die beste Lösung gewesen -, aber es ist nicht ... und Sie ignorieren alle
Binnengewässer

3

Diese Methode ist völlig unzuverlässig. Tatsächlich hängen die zurückgegebenen Daten vollständig davon ab, mit welchem ​​Teil der Welt Sie arbeiten. Zum Beispiel arbeite ich in Frankreich. Wenn ich auf das Meer an der Küste Frankreichs klicke, gibt Google den nächstgelegenen LAND-Standort zurück, den es "erraten" kann. Als ich bei Google Informationen zu derselben Frage anforderte, antworteten sie, dass sie den angeforderten Punkt für eine Wassermasse nicht genau zurückgeben können.

Keine sehr zufriedenstellende Antwort, ich weiß. Dies ist ziemlich frustrierend, insbesondere für diejenigen von uns, die dem Benutzer die Möglichkeit geben, auf die Karte zu klicken, um eine Markierungsposition zu definieren.


1
Ich stimme zu - die von @ user1113426 und @Andrew Leach vorgeschlagenen Methoden sind keine wirklichen Methoden. es ist besser, den Nutzern zu sagen "klicke nicht auf die blauen Bereiche" :-) aber im Ernst - ich bin sehr überrascht, dass Google eine solche Funktion nicht veröffentlichen will - auch wenn sie ungefähr ist - es ist besser als die "Annäherung", dass existiert jetzt - das wie Sie Zeiger - manchmal "schnappt" an einem Ort Hunderte von Metern entfernt. Sogar meine vorgeschlagene Methode ist genauer (schade, dass ich keine Ahnung habe, wie ich das erreichen soll.)
Obmerk Kronen

3

Wenn alles andere fehlschlägt, können Sie immer versuchen, die Höhe am Punkt und in einiger Entfernung zu überprüfen - nicht viele andere Dinge als Wasser sind in der Regel völlig flach.


danke, das ist eine schöne Idee, aber es würde spektakulär an jedem Wasserfall oder einer Flussschlucht scheitern ...
Obmerk Kronen

2

Leider befindet sich diese Antwort nicht in der Google Maps-API und die Ressource, auf die verwiesen wird, ist nicht kostenlos. Es gibt jedoch einen von DynamicGeometry bereitgestellten Webdienst, der eine Operation verfügbar macht, GetWaterOrLanddie ein Längen- / Breitengradpaar akzeptiert ( eine Demo finden Sie hier ).

Mein Verständnis, wie dies implementiert wird, ist die Verwendung von Gewässerformdateien. Wie genau diese Formdateien mit der Google Maps-API verwendet werden, aber Sie können möglicherweise einen Einblick in die verknüpfte Demo erhalten.

Hoffe das hilft irgendwie.


2

Hier ist ein weiteres Beispiel in reinem JavaScript: http://jsfiddle.net/eUwMf/

Wie Sie sehen können, entspricht die Idee im Wesentlichen der von rebe100x, wobei das Bild von der statischen Karten-API von Google abgerufen und das erste Pixel gelesen wird:

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

Hier ist eine einfache Lösung

Da Google keine zuverlässigen Ergebnisse in Bezug auf Koordinaten liefert, die entweder auf Meeres- oder Binnengewässern liegen, müssen Sie einen anderen Sicherungsdienst wie Yandex verwenden, um diese wichtigen Informationen bereitzustellen, wenn sie fehlen. Sie möchten Yandex höchstwahrscheinlich nicht als primären Geocoder verwenden, da Google in Bezug auf Zuverlässigkeit und Vollständigkeit der Weltdaten weit überlegen ist. Yandex kann jedoch sehr nützlich sein, um Daten abzurufen, wenn es sich um Koordinaten über Gewässern handelt. Verwenden Sie also beide.


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


Die Schritte zum Abrufen des Ozeannamens:

1.) Verwenden Sie zuerst Google, um die Koordinate umzukehren.

2.) Wenn Google keine Ergebnisse zurückgibt, liegt die Koordinate zu 99% wahrscheinlich über einem Ozean. Stellen Sie nun eine sekundäre Reverse-Geocodierungsanforderung mit denselben Koordinaten an Yandex. Yandex gibt eine JSON-Antwort mit den genauen Koordinaten zurück. Innerhalb dieser Antwort befinden sich zwei wichtige Schlüsselpaare "Schlüssel": "Wert"

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

and

["GeoObject"]["name"]

Überprüfen Sie den freundlichen Schlüssel, wenn er == "hydro" ist und Sie wissen, dass Sie sich über einem Gewässer befinden. Da Google keine Ergebnisse zurückgegeben hat, ist es zu 99,99% wahrscheinlich, dass dieses Gewässer ein Ozean ist. Der Name des Ozeans ist der oben genannte "Name" -Schlüssel.

Hier ist ein Beispiel, wie ich diese in Ruby geschriebene Strategie verwende

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

Die Schritte zum Abrufen eines Inland Body of Water-Namens:

In diesem Beispiel wird angenommen, dass unsere Koordinate irgendwo in einem See liegt:

1.) Verwenden Sie zuerst Google, um die Koordinate umzukehren.

2.) Google wird höchstwahrscheinlich ein Ergebnis zurückgeben, das eine prominente Standardadresse an Land in der Nähe ist. In diesem Ergebnis werden die Koordinaten der zurückgegebenen Adresse angegeben. Diese Koordinate stimmt nicht mit der von Ihnen angegebenen überein. Messen Sie den Abstand zwischen der von Ihnen angegebenen und der mit dem Ergebnis zurückgegebenen Koordinate. Wenn er sich erheblich unterscheidet (z. B. 100 Meter), führen Sie eine sekundäre Sicherungsanforderung mit Yandex durch und überprüfen Sie, ob der Wert des Schlüssels "Art" vorhanden ist Ist "Hydro", dann wissen Sie, dass die Koordinate auf dem Wasser liegt. Da Google im Gegensatz zum obigen Beispiel ein Ergebnis zurückgegeben hat, ist es zu 99,99% wahrscheinlich, dass es sich um ein Binnengewässer handelt, sodass Sie jetzt den Namen erhalten können. Wenn "kind" nicht == "hydro" ist, verwenden Sie das geokodierte Google-Objekt.

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

and

["GeoObject"]["name"]

Hier ist der gleiche Code, der in Ruby geschrieben wurde, um inland_body_of_water zu erhalten

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

Ein Hinweis zur Lizenzierung: Soweit ich weiß, erlaubt Google Ihnen nicht, ihre Daten für die Anzeige auf anderen Karten als den von Google angebotenen zu verwenden. Yandex verfügt jedoch über eine sehr flexible Lizenzierung, und Sie können ihre Daten verwenden, um sie auf Google Maps anzuzeigen.

Außerdem hat Yandex ein hohes Ratenlimit von 50.000 Anfragen / Tag kostenlos und ohne erforderlichen API-Schlüssel.


1

Ich habe es geschafft, mit der Google Elevation API ganz nah dran zu sein. Hier ist ein Bild der Ergebnisse:

Screenshot der Ergebnisse

Sie sehen, dass die Sechsecke so ziemlich an Land bleiben, obwohl ein rechteckiger Umfang definiert ist, der teilweise über Wasser verläuft. In diesem Fall habe ich eine schnelle Überprüfung von Google Maps selbst durchgeführt und die Mindesthöhe an Land betrug ca. 8-9 m, sodass dies meine Schwelle war. Der Code wird größtenteils aus der Google-Dokumentation und dem Stapelüberlauf kopiert / eingefügt. Hier ist der vollständige Kern:

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



2
Dies ist ein gutes Beispiel für eine mögliche Verwendung. aber es wird auf Binnengewässern (Lago di Garda - Italien im Beispiel des verknüpften Bildes) herrlich scheitern . Sehr schöner Code, der als mögliche Grundlage für eine andere Lösung dienen soll!
Obmerk Kronen

1

Wenn List<Address> Adresse 0 zurückgibt, können Sie diesen Ort als Ozean oder natürliche Ressourcen annehmen. Fügen Sie einfach den folgenden Code in Ihre Antwort hinzu. Methode der Google Places-API-Antwort.

Initialisieren Sie die folgende Liste wie erwähnt

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

Als absoluter Anfänger von Python konnte ich SylvainBs Lösung nicht dazu bringen, mit dem Python-Skript zu arbeiten, das prüft, ob Koordinaten an Land sind. Ich habe es jedoch herausgefunden, indem ich OSGeo4W ( https://trac.osgeo.org/osgeo4w/) heruntergeladen habe. ) und dann alles installiert habe, was ich für pip, Ipython brauchte, und überprüft habe, ob alle angegebenen Importe vorhanden waren. Ich habe den folgenden Code als .py-Datei gespeichert.

Code, um zu überprüfen, ob die Koordinaten an Land sind

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

Ich habe versucht, es in R zum Laufen zu bringen, aber ich hatte einen Albtraum, als ich versuchte, alle Pakete zu bekommen, die Sie für die Installation benötigen, also blieb ich bei Python.


-3

Ich habe hier eine andere Lösung. In der aktuellen Google Map-Implementierung wird die Richtung / Entfernung von einem Wasserstandort zum Landstandort und umgekehrt nicht berechnet. Warum verwenden wir diese Logik nicht, um festzustellen, ob der Punkt Land oder Wasser ist?

Nehmen wir zum Beispiel dieses Beispiel

Wenn wir feststellen wollen, ob ein Punkt xLand oder Wasser ist, dann

Lassen Sie uns die Richtung zwischen dem Punkt xund einem bekannten Punkt, yder Land ist , überprüfen . Wenn es die Richtung / Entfernung bestimmt, ist der Punkt xLand oder Wasser.


Haben Sie es tatsächlich versucht oder nehmen Sie nur an, "aus Wasser kochen"?
TMS

Und wie soll man mit Brücken umgehen? oder Tunnel?
Obmerk Kronen
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.