..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".
quelle
Antworten:
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 Typnatural_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, Ocean
und einige andere Wörter im Zusammenhang mit Gewässern enthalten, um eine genauere Darstellung zu erhalten. Zum Beispiel sind die Wüsten auchnatural_feature
s.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:
latitude
,longitude
undcurrent zoom
von Kunden.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.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
canvas
Element zeichnen . Sie können dengetImageData
Canvas-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
quelle
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 .
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 :
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.
quelle
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.
quelle
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
Beispiel an Land: https://api.onwater.io/api/v1/results/42.35,-71.1
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 :)
quelle
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.
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)
quelle
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!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.
quelle
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
type
durch umgekehrte Geokodierung zurückgegebenen oder der Höhe, fallstype
nicht verfügbar, deckt jedoch die meisten Eventualitäten ab.quelle
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.
quelle
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.
quelle
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,
GetWaterOrLand
die 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.
quelle
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:
quelle
Siehe die Antwort, die ich auf eine ähnliche Frage gegeben habe - sie verwendet "HIT_TEST_TERRAIN" von der Erd-API, um die Funktion zu erreichen.
Es gibt ein funktionierendes Beispiel für die Idee, die ich hier zusammengestellt habe: http://www.msa.mmu.ac.uk/~fraser/ge/coord/
quelle
Ich würde empfehlen, hier Ihre eigenen zu rollen. Sie können Tools wie GDAL verwenden , um den Inhalt unter einem Punkt in einem Shapefile abzufragen. Sie können Shapefiles für die US-Geographie aus vielen Quellen erhalten, einschließlich dem US Census Bureau .
Dies kann über GDAL-Binärdateien, die Quelle C oder über swig in Java, Python und mehr erfolgen.
Volkszählungskarten
GDAL-Informationen
Beispiel für eine Punktabfrage in Python
quelle
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"
Ü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
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.
Hier ist der gleiche Code, der in Ruby geschrieben wurde, um inland_body_of_water zu erhalten
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.
quelle
Ich habe es geschafft, mit der Google Elevation API ganz nah dran zu sein. Hier ist ein Bild 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
quelle
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{ }
quelle
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
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.
quelle
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
x
Land oder Wasser ist, dannLassen Sie uns die Richtung zwischen dem Punkt
x
und einem bekannten Punkt,y
der Land ist , überprüfen . Wenn es die Richtung / Entfernung bestimmt, ist der Punktx
Land oder Wasser.quelle