Używamy Google AppEngine do uruchamiania zapytań przestrzennych / atrybutów, a głównym problemem (od pierwszego dnia) jest sposób indeksowania dużych zestawów linii / wielokątów o dowolnym rozmiarze. Dane punktowe nie są zbyt trudne (patrz geohash, geomodel itp.), Ale zestawy losowo zgrupowanych małych / dużych wielokątów zawsze stanowiły problem (aw niektórych przypadkach nadal występuje)
Wypróbowałem kilka różnych wersji indeksowania przestrzennego na GAE, ale większość z nich to tylko dwa warianty poniżej. Żadne z nich nie było tak szybkie jak bazy danych SQL i wszystkie mają zalety / wady. kompromisy wydają się rozsądne w przypadku większości aplikacji do mapowania przez Internet. Ponadto dwa poniższe muszą być połączone z buforowaniem geometrii w pamięci (poprzez JTS itp.), Aby usunąć wszelkie funkcje, które nie pasują do ostatecznych parametrów wyszukiwania. i wreszcie, opierają się na specyficznych funkcjach GAE, ale jestem pewien, że można by go zastosować do innych architektur (lub użyć TyphoonAE do uruchomienia na klastrze linux, ec2 itp.)
Siatki - spakuj wszystkie funkcje dla określonego obszaru do znanego indeksu siatki. Umieść mały indeks przestrzenny na siatce, aby szybko nawigować po zestawie funkcji, które on zawiera. W przypadku większości zapytań wystarczy wyciągnąć garść siatek, co jest szybkie, ponieważ znasz dokładną konwencję nazewnictwa siatki i jej związek z jednostkami K / V (pobiera, a nie zapytania)
Plusy - dość szybkie, łatwe do wdrożenia, nie zajmują miejsca w pamięci.
Wady - konieczne jest wstępne przetwarzanie, użytkownik musi zdecydować o wielkości siatki, duże geomy są współdzielone na kilku sieciach, klastrowanie może powodować przeciążenie sieci, problemy z serializacją / deserializacją mogą stanowić problem (nawet po skompresowaniu przez bufory protokołu)
QuadKeys - To jest bieżąca implementacja. w zasadzie jest taki sam jak siatki, z tym że nie ma ustalonego poziomu siatki. w miarę dodawania funkcji są one indeksowane według siatki quadkey, która całkowicie zawiera ich granice (lub w niektórych przypadkach, podzielona na dwie części, gdy pojedynczy quadkey nie może być użyty, pomyśl linię danych). Po znalezieniu qk jest on następnie dzielony na maksymalną liczbę mniejszych qk, które zapewniają dokładniejsze odwzorowanie ziarna cechy. wskaźnik / bbox do tej funkcji jest następnie pakowany do lekkiego gridindex (grupa funkcji), do którego można uzyskać zapytanie (oryginalny projekt bezpośrednio sprawdzał funkcje, ale okazało się to zbyt wolne / intensywnie obciążające procesor w przypadkach, gdy zestaw wyników był duży)
Polyline Quadkeys http://www.arc2earth.com/images/help/GAE_QKS_1.png
Polygon Quadkeys http://www.arc2earth.com/images/help/GAE_QKS_2.png
Konwencja nazewnictwa quadkey zastosowana powyżej jest dobrze znana i, co ważniejsze, dąży do zachowania lokalizacji (opisana bardziej tutaj )
Wielokąt powyżej wygląda mniej więcej tak: 0320101013123 03201010131212 03201010131213 0320101013132 0320101013133 03201010131302 03201010131303 032010101313002 032010101313003 032010101313012 032010101311313132010101313131313 03201010131313131320101013131313132010101313131313 03101013133 1313 0310101313131313 0310101313131313 0310101313131313 0310101313131313 03101013133131310101313103
jeśli granice zapytania są wystarczająco małe, możesz bezpośrednio pobrać za pomocą qk. jest to optymalne, ponieważ jest to tylko pojedyncze, wsadowe wywołanie rpc do bazy danych GAE. jeśli granice są na tyle duże, że zawierały zbyt wiele możliwych qk (> 1000), możesz alternatywnie wykonać zapytanie za pomocą filtru (np .: qk> = 0320101013 i qk <= 0320101013 + \ ufffd). Konwencja nazewnictwa quadkey oraz sposób indeksowania ciągów GAE pozwala powyższemu zapytaniu pobrać tylko istniejące siatki, które spadają poniżej tej wartości qk.
istnieją inne zastrzeżenia i problemy z perfem, ale ogólnie jego zdolność do zapytania o quadkeys sprawia, że jest to wykonalne
przykłady - zapytanie o hrabstwa USA: geojson
Plusy - dość szybko, bez konfiguracji rozmiaru siatki, bez pamięci, bez przepełnienia sieci
Wady - konieczne jest wstępne przetwarzanie, możliwe przekroczenie niektórych scenariuszy, brak danych biegunowych
Krzywe wypełniania przestrzeni - spójrz na dyskusję Alfreda na temat zapytań NextGen w Google I / O w tym roku. Włączenie ogólnych krzywych wypełniania przestrzeni / czasu wraz z nowymi operatorami MultiQuery (równolegle) pozwoli na naprawdę fajne zapytania przestrzenne. Czy pobije tradycyjną wydajność SQL? Trudno powiedzieć, ale powinno się dobrze skalować. Szybko zbliżamy się do przyszłości, w której zawsze dostępne urządzenia mobilne wszystkich kształtów i rozmiarów znacznie zwiększą ruch w Twojej witrynie / usłudze.
wreszcie zgodziłbym się również, że powinieneś bardzo uważnie przyjrzeć się swojej domenie problemowej przed wybraniem NoSQL zamiast SQL. W naszym przypadku bardzo podobał mi się model wyceny GAE, więc naprawdę nie było wyboru, ale jeśli nie musisz skalować, zaoszczędź trochę czasu i po prostu użyj standardowej bazy danych sql
Słyszałem o GeoCouch, który jest implementacją CouchDB dla danych lokalizacyjnych. Myślę też, że MongoDB ma możliwości indeksowania geoprzestrzennego.
źródło
Jest to głównie pytanie o algorytmy. Przepełnienie stosu może być również dobrym miejscem do tego.
W każdym razie odpowiedź na twoje bezpośrednie pytanie brzmi „tak, możesz użyć sklepu kvp do reprezentowania danych przestrzennych”. Lepszym pytaniem może być jednak „POWINIENEM używać magazynu kvp do reprezentowania danych przestrzennych?”
Odpowiedź na to pytanie (jak wiele innych) brzmi „to zależy”. Zależy to od skali, obciążenia (transakcyjnego) pracy, charakteru danych i infrastruktury obliczeniowej, którą masz do dyspozycji.
Magazyn kvp będzie miał niski narzut, co może pomóc w zwiększeniu przepustowości w przypadku dużych ilości równoległości wstawiania i aktualizacji. Nie będzie to jednak bardzo szybkie wyszukiwanie przestrzenne (znajdź wszystkie obiekty w prostokącie). W tym celu potrzebujesz indeksu przestrzennego, takiego jak R-Tree.
Jeśli jednak masz naprawdę duży wolumin danych i ogromny klaster komputerów, to użycie indeksu kvp może zapewnić pewne korzyści w zakresie wydajności. Jedynym sposobem, aby naprawdę się upewnić, jest wykonanie pomiarów perfów przy użyciu rzeczywistych danych i dostęp do szablonów, których można się spodziewać.
Aktualizacja :
Oto trochę więcej informacji. Możesz użyć sklepu KVP do wyszukiwania przestrzennego. Problem polega na tym, że jest powolny. Aby zobaczyć dlaczego, rozważ coś takiego:
Gdzie * i # reprezentują obiekty ułożone w siatce 11 x 11, których początek znajduje się w lewym górnym rogu. Wyobraź sobie wyszukiwanie obiektów w prostokącie (4,4) - (7,7). To powinno znaleźć wszystkie „#”. Zakładając, że używasz drzewa b + do reprezentowania swoich indeksów w sklepie KVP, możesz znaleźć wyniki za pomocą indeksu „X” lub indeksu „Y”. W tym przypadku nie ma znaczenia który. Dla celów dyskusji użyję indeksu x. Zrobiłbyś przeglądanie dziennika (n) w indeksie X, aby znaleźć pierwszy węzeł o wartości X „4”, a następnie iterować przez węzły liścia drzewa b +, aż znajdziesz węzeł o wartości większej niż 7. W miarę jak iteruj przez indeks x, a następnie odrzucisz wszystko, co jest poza pożądanym zakresem y.
To jest powolne. Wyobraź to sobie na dużej siatce o tej samej gęstości, powiedzmy 100 K * 100 K. W takim przypadku musiałbyś zeskanować wpisy indeksu „300 000”, aby znaleźć tylko 9 rekordów. Jeśli jednak użyjesz odpowiednio zbalansowanego drzewa R, wówczas wyszukiwanie indeksu prawdopodobnie wymagałoby jedynie zeskanowania około 90 rekordów. To ogromna różnica.
Problem polega jednak na tym, że utrzymanie zbalansowanego drzewa R jest kosztowne. Dlatego odpowiedź brzmi „to zależy” i dlaczego pytanie „powinienem to zrobić” jest o wiele ważniejsze niż „jak to zrobić”.
Jeśli często wstawiasz i usuwasz rekordy i przeszukujesz głównie „identyfikator obiektu”, a często nie wyszukujesz „przestrzennie”, to użycie twojego indeksu KVP da ci lepszą wydajność do tego, do czego tak naprawdę chcesz używać systemu . Jeśli jednak wstawiasz lub usuwasz rzadko, ale często przeszukujesz przestrzennie, to chcesz użyć R-drzewa.
źródło
Jeśli używasz wartości lat / long, możesz użyć geohashów jako wartościowej części swojego sklepu.
Oto jeden z NYC. dr5regy6rc6ye
Dzięki geohash możesz zacząć strącać postacie na końcu geohash, aby uzyskać siatkę o różnej precyzji: http://geohash.org/dr5re
Przykładowa implementacja js: http://github.com/davetroy/geohash-js
źródło
W większości przypadków więcej relacyjnych narzędzi do przechowywania danych uzyskasz niż z klucza / wartości lub klucza / wartości / typu. Wydajne zapytania i raporty dotyczące tego rodzaju schematów danych są bardzo skomplikowane.
Radzę dokładnie przeanalizować, czy twoja waga rzeczywiście wymaga NoSQL, zanim zastanowisz się, jak go używać.
źródło
Spójrz na tę aplikację GAE, która serializuje geometrię JTS do BigTable . Możesz być w stanie zaadaptować go do innych silników pamięci masowej NoSQL .
źródło
MongoDB ma możliwość tworzenia i wykorzystywania indeksów geoprzestrzennych w oparciu o ścisłe właściwości krotek 2d [x, y] Dokumentów i pozwala na zapytania typu „bliskie” i „granice”. Jednak nie obsługuje żadnych korekt dla rzutów i wykorzystuje wyidealizowany model płaskiej ziemi
źródło
Używałbym magazynów kluczy / wartości tylko jako warstwę buforującą, patrz http://www.membase.org/ lub http://wiki.basho.com/display/RIAK/How+Things+Work (riak_kv_cache_backend)
W zależności od potrzeb aplikacji nadal możesz mieć dostęp do danych w języku SQL.
źródło
Jest to z pewnością nowy obszar zainteresowania, kilka nadchodzących rozmów z konferencji FOSS4G :
źródło