2016-12-07 2 views
1

Frage 1:Datastore-Abfrage für Standorte innerhalb einer Region

Ich verwende Google-Datenspeicher (Java Client-Bibliotheken) mit App Engine Flex und ich bin Speichern von Ortsdaten. Ich möchte nach einer Liste von Orten innerhalb einer rechteckigen Region fragen.

Mein Standort Einheit sieht wie folgt aus:

Location 
    - lat (eg. -56.1) 
    - long (eg. 45.6) 

Google-Datenspeicher hat Einschränkungen für mit mehreren Ungleichheiten auf unterschiedliche Eigenschaften abfragen, so kann ich nicht mit GQL wie diese Abfrage:

SELECT * FROM Location WHERE lat <= @maxLat AND lat >= @minLat AND long <= @maxLong AND long >= @minLong 

Wo maxLat , minLat, maxLong und minLong stellen das Begrenzungsrechteck für die Suche nach Speicherorten dar.

Ich Abfrage Derzeit nur ein Filter mit:

SELECT * FROM Location WHERE lat <= @maxLat AND lat >= @minLat 

Und von den zurückgegebenen Ergebnissen, ich auch die, die innerhalb der Grenzen Länge herauszufiltern. Gibt es dafür einen besseren Weg, ohne auf diese Strategie zurückzugreifen?

Frage 2:

Wenn ich die Breite/Länge Kombination als Geopunkt in Google-Datenspeicher gespeichert werden, wie kann ich die geografische Breite und Länge überprüfen?

Location 
    - location (Geopoint) 

ich im Geopunkt der Java-Client-Bibliotheken unter Verwendung von auf dem lat/long nicht filtern:

Zum Beispiel, wenn der Standort wird wie folgt gespeichert.

SELECT * FROM Location WHERE location.long <= @maxLong 

Gibt es eine Problemumgehung für die Datastore Geopoint-Eigenschaft?

Antwort

1

Um ein Beispiel dafür zu erhalten, sehen Sie sich die Bibliothek 'geomodel' in Python an.

Grund Prämisse:

Teilen Sie Ihre Breiten- und Längenwerte in diskrete Werte (zum Beispiel 1 Grad Blöcke), da durch ‚Zellen‘ zu definieren, dass der Wert in enthaltene Kombinieren/Hash dann zusammen, so dass Sie haben. ein einzelner Wert.

Jetzt können Sie Ihre Abfragen für Positionen in einem begrenzten Rechteck konvertieren, indem Sie Gleichheitsfilter für diese Zellen ausführen. Posten Sie den Filter am Ende, wenn Ihr begrenztes Rechteck nicht vollständig mit den Zellkanten übereinstimmt.

Ein verwandtes Beispiel hierfür mit der Zeit zu tun ist: Is datastore good for storing hr shifts?

+0

Ich verstehe nicht ganz, was Sie mit dieser Strategie meinen. Ich verwende 1-Grad-Zellen mit Zelle 0, die lat darstellt: -90,0 bis -89,0 und lang: -180,0 bis -179,0. Die Zellenzahl erhöht sich jedes Mal, wenn der Breitengrad zunimmt, und sobald Breitengrad 89,0 bis 90,0 erreicht, geht es zurück zu -90,0 bis -89,0 und erhöht den Längenwert um 1 Grad. Dann wird der Ort (0, 0) dargestellt, indem er sich innerhalb der Zelle 32, 399 befindet (Der Ort ist eine Ecke von vier verschiedenen Zellen. In welcher Zelle ist 'in'?). Ist das was du vorschlägst? Wenn die Bounding Box eine sehr kleine Box ist, müssten die Zellen sehr spezifisch sein? (0,0001 Grad Blöcke) – Kookz

+0

Ich habe lange darüber nachgedacht, aber ich verstehe Ihre Lösung immer noch nicht. Könnten Sie ein bisschen mehr erweitern und vielleicht eine Beispiellösung zeigen? Vielen Dank ! – Kookz

-1

Check-out-Datenspeichers des REST-API.Es gibt einen expliziten Wert Typ für geopoints, die Sie auf den Link unten dokumentiert finden können:

https://cloud.google.com/datastore/docs/reference/rest/v1/projects/runQuery#Value

Alles, was Sie zu tun, dann brauchen, ist ein GeoPoint Wert Eigenschaft erstellen (lassen Sie uns es geo nennen) auf eine Entität und dann können Sie GQL-Abfragen wie folgt schreiben:

SELECT * FROM Address WHERE geo.latitude <= @maxLat AND geo.latitude >= @minLat 
Verwandte Themen