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