Wir verwenden Google AppEngine, um räumliche Abfragen / Attributabfragen auszuführen. Das Hauptproblem (vom ersten Tag an) besteht darin, große Mengen von Linien / Polygonen beliebiger Größe zu indizieren. Punktdaten sind nicht allzu schwierig (siehe Geohash, Geomodell usw.), aber Sätze von zufällig gruppierten kleinen / großen Polygonen waren immer ein Problem (und sind es in einigen Fällen immer noch).
Ich habe verschiedene Versionen der räumlichen Indizierung auf GAE ausprobiert, aber die meisten sind nur Varianten von zwei unten. Keine war so schnell wie SQL-Datenbanken und alle haben Vor- und Nachteile. Die Kompromisse scheinen jedoch für die meisten internetbasierten Kartierungs-Apps angemessen zu sein. Außerdem müssen die beiden folgenden Elemente mit In-Memory-Geometrie-Culling (über JTS usw.) gekoppelt werden, um Features zu entfernen, die nicht den endgültigen Suchparametern entsprechen. und schließlich basieren sie auf GAE-spezifischen Funktionen, aber ich bin sicher, dass sie auch auf andere Architekturen angewendet werden können (oder verwenden Sie TyphoonAE, um auf einem Linux-Cluster, EC2 usw. zu laufen).
Grids - Packung alle Funktionen für einen bestimmten Bereich in einem bekannten Rasterindex. Platzieren Sie einen kleinen räumlichen Index im Raster, damit Sie schnell durch die darin enthaltenen Features navigieren können. Bei den meisten Abfragen müssen Sie nur eine Handvoll Raster ziehen, was sehr schnell ist, da Sie die genaue Namenskonvention für Raster kennen und wissen, wie sie sich auf K / V-Entitäten bezieht (erhält, nicht Abfragen).
Vorteile - ziemlich schnell, einfach zu implementieren, kein Speicherbedarf.
Cons - Vorverarbeitung erforderlich, Benutzer muss die Größe des Grids festlegen, große Geoms werden auf mehreren Grids gemeinsam genutzt, Clustering kann zu einer Überlastung der Grids führen, Serialisierungs- / Deserialisierungskosten können ein Problem darstellen (auch bei Komprimierung über Protokollpuffer)
QuadKeys - Dies ist die aktuelle Implementierung. Grundsätzlich ist es dasselbe wie bei Grids, außer dass es keine festgelegte Grid-Ebene gibt. Wenn Features hinzugefügt werden, werden sie durch das Quadkey-Raster indiziert, das ihre Grenzen vollständig enthält (oder in einigen Fällen zweigeteilt, wenn ein einzelner Quadkey nicht verwendet werden kann, denken Sie an die Datumsgrenze). Nachdem das qk gefunden wurde, wird es in eine maximale Anzahl kleinerer qk aufgeteilt, die feinere Körnungsdarstellungen des Merkmals liefern. Ein Zeiger / eine Box auf dieses Feature wird dann in einen kompakten Gridindex (eine Gruppe von Features) gepackt, der abgefragt werden kann (ein ursprüngliches Design hat die Features direkt abgefragt, dies erwies sich jedoch in Fällen, in denen die Ergebnismenge groß war, als zu langsam / CPU-intensiv).
Polyline Quadkeys http://www.arc2earth.com/images/help/GAE_QKS_1.png
Polygon-Quadkeys http://www.arc2earth.com/images/help/GAE_QKS_2.png
Die oben verwendete Namenskonvention für Quadkeys ist allgemein bekannt und neigt, was noch wichtiger ist, dazu, die Lokalität zu bewahren (wird hier genauer beschrieben ).
Das obige Polygon sieht ungefähr so aus:
Wenn die Abfragegrenzen klein genug sind, können Sie sie direkt über qk abrufen. Dies ist optimal, da es sich nur um einen einzelnen Batch-RPC-Aufruf des GAE-Datenspeichers handelt. Wenn die Grenzen groß genug sind, dass sie zu viele mögliche qks (> 1000) enthalten, können Sie alternativ mit einem Filter abfragen (z. B .: qk> = 0320101013 und qk <= 0320101013 + \ ufffd). Die Quadkey-Namenskonvention und die Art und Weise, wie GAE Zeichenfolgen indiziert, ermöglichen es der obigen Abfrage, nur die vorhandenen Gitter abzurufen, die unter diesen qk-Wert fallen.
Es gibt noch andere Vorbehalte und Leistungsprobleme, aber im Allgemeinen ist es die Fähigkeit, die Quadkeys abzufragen, die es möglich macht
Beispiele - Abfrage nach US-Landkreisen: Geojson
Vorteile - ziemlich schnell, keine Konfiguration der Rastergröße, kein Speicherbedarf, keine überfüllten Raster
Cons - Preprocessing erforderlich, in einigen Szenarien mögliches Overfetch, keine polaren Daten
Raumfüllende Kurven - Sehen Sie sich in diesem Jahr Alfred's NextGen Queries Talk bei Google I / O an. Die Einbeziehung generischer Raum / Zeit-Füllkurven zusammen mit den neuen MultiQuery-Operatoren (parallel ausgeführt) ermöglicht einige wirklich coole räumliche Abfragen. Wird es die traditionelle SQL-Leistung übertreffen? Schwer zu sagen, aber es sollte wirklich gut skalieren. Und wir nähern uns schnell einer Zukunft, in der immer verfügbare mobile Geräte aller Formen und Größen den Verkehr zu Ihrer Site / Ihrem Service dramatisch ansteigen lassen.
Schließlich stimme ich auch zu, dass Sie sich Ihre Problemdomäne genau ansehen sollten, bevor Sie sich für NoSQL statt SQL entscheiden. In unserem Fall hat mir das Preismodell von GAE sehr gut gefallen. Es gab also keine andere Wahl. Wenn Sie jedoch nicht skalieren müssen, sparen Sie sich Zeit und verwenden Sie einfach eine Standard-SQL-Datenbank
Ich habe von GeoCouch gehört, einer Implementierung von CouchDB für ortsbasierte Daten. Und ich denke auch, dass MongoDB Geodatenindizierungsfunktionen hat.
quelle
Dies ist hauptsächlich eine Frage zu Algorithmen. Ein Stapelüberlauf kann auch ein guter Ort sein, um danach zu fragen.
In jedem Fall lautet die Antwort auf Ihre direkte Frage "Ja, Sie können einen kvp-Speicher verwenden, um räumliche Daten darzustellen." Eine bessere Frage könnte jedoch lauten: "Soll ich einen kvp-Speicher zur Darstellung von Geodaten verwenden?"
Die Antwort auf diese Frage lautet (wie bei vielen anderen) "es kommt darauf an". Dies hängt von Ihrer Größenordnung, Ihrer (Transaktions-) Arbeitslast, der Art der Daten und der Computerinfrastruktur ab, über die Sie verfügen.
Ein kvp-Speicher hat einen geringen Overhead, wodurch der Durchsatz für hohe Einfüge- und Aktualisierungsparallelitäten erhöht werden kann. Es ist jedoch nicht sehr schnell, räumliche Suchen durchzuführen (alle Objekte innerhalb eines Rechtecks finden). Dafür möchten Sie einen räumlichen Index, wie einen R-Baum.
Wenn Sie jedoch über ein sehr großes Datenvolumen und eine große Anzahl von Computern verfügen, kann die Verwendung eines kvp-Index einige Leistungsvorteile bieten. Die einzige Möglichkeit, wirklich sicher zu sein, besteht darin, Perfektionsmessungen unter Verwendung der tatsächlichen Daten und Zugriffsmuster durchzuführen, auf die Sie voraussichtlich stoßen werden.
Update :
Hier ist ein bisschen mehr Info. Sie können einen KVP-Speicher verwenden, um räumliche Suchen durchzuführen. Das Problem ist, dass es langsam ist. Um zu sehen, warum, überlegen Sie sich Folgendes:
Wobei * und # Objekte darstellen, die in einem 11x11-Raster angeordnet sind und deren Ursprung sich in der oberen linken Ecke befindet. Stellen Sie sich eine Suche nach Objekten im Rechteck (4,4) - (7,7) vor. Das sollte alle "#" finden. Angenommen, Sie verwenden einen b + -Baum, um Ihre Indizes im KVP-Speicher darzustellen, können Sie die Ergebnisse entweder über den "X" -Index oder den "Y" -Index ermitteln. In diesem Fall spielt es keine Rolle, welche. Zur Erörterung verwende ich den x-Index. Sie würden im X-Index ein Protokoll (n) nachschlagen, um den ersten Knoten mit dem X-Wert "4" zu finden, und dann die b + -Baum-Blattknoten durchlaufen, bis Sie einen Knoten mit einem Wert größer als 7 gefunden haben Durchlaufen Sie den x-Index, um alles abzulehnen, was außerhalb des gewünschten y-Bereichs liegt.
Das ist langsam. Stellen Sie es sich in einem großen Raster mit der gleichen Dichte vor, beispielsweise 100 K * 100 K. Dort müssten Sie am Ende "300.000" Indexeinträge scannen, um nur 9 Datensätze zu finden. Wenn Sie jedoch einen richtig ausgeglichenen R-Tree verwenden, muss die Indexsuche wahrscheinlich nur etwa 90 Datensätze durchsuchen. Das ist ein großer Unterschied.
Das Problem ist jedoch, dass es teuer ist, einen R-Tree im Gleichgewicht zu halten. Deshalb lautet die Antwort "es kommt darauf an", und warum ist die Frage "sollte ich das tun" viel wichtiger als "wie mache ich das?".
Wenn Sie häufig Datensätze einfügen und entfernen und meistens nach "Objekt-ID" suchen und nicht häufig nach "räumlichen" Datensätzen suchen, erhalten Sie mit Ihrem KVP-Index eine bessere Leistung für das, wofür Sie das System tatsächlich verwenden möchten . Wenn Sie jedoch nur selten einfügen oder löschen, aber häufig räumliche Suchen durchführen, möchten Sie einen R-Tree verwenden.
quelle
Wenn Sie Lat / Long-Werte verwenden, können Sie möglicherweise Geohashes als Werteteil Ihres Geschäfts verwenden.
Hier ist eine für NYC. dr5regy6rc6ye
Mit der Geohash können Sie Zeichen am Ende der Geohash entfernen, um ein Raster mit unterschiedlicher Genauigkeit zu erhalten: http://geohash.org/dr5re
Beispiel für die Implementierung von js: http://github.com/davetroy/geohash-js
quelle
In den meisten Fällen erhalten Sie mehr Nutzen aus der relationalen Datenspeicherung als aus der Speicherung von Schlüssel / Wert oder Schlüssel / Wert / Typ. Bei der effizienten Abfrage und Berichterstellung für diese Art von Datenschema treten erhebliche Schwierigkeiten auf.
Mein Rat wäre, genau zu prüfen, ob Ihre Waage tatsächlich NoSQL benötigt, bevor Sie überlegen, wie Sie sie verwenden.
quelle
Schauen Sie sich diese GAE-App an , die die JTS- Geometrie in BigTable serialisiert . Möglicherweise können Sie es für andere NoSQL-Speicher-Engines übernehmen .
quelle
MongoDB bietet die Möglichkeit, Geodatenindizes basierend auf strengen 2d [x, y] -Tupel-Eigenschaften von Dokumenten zu erstellen und zu konsumieren. Außerdem können Abfragen vom Typ "Near" und "Bounds" durchgeführt werden. Es verarbeitet jedoch keine Korrekturen für Projektionen und verwendet ein idealisiertes Modell einer flachen Erde
quelle
Ich würde Schlüssel- / Wertspeicher nur als Cache-Ebene verwenden, siehe http://www.membase.org/ oder http://wiki.basho.com/display/RIAK/How+Things+Work (riak_kv_cache_backend).
Abhängig von Ihren App-Anforderungen möchten Sie möglicherweise weiterhin SQL-Zugriff auf die Daten haben.
quelle
Dies ist sicherlich ein aufstrebendes Gebiet von Interesse, ein paar bevorstehende Vorträge von der FOSS4G-Konferenz :
quelle