Utilizziamo Google AppEngine per eseguire query spaziali / di attributi e il problema principale (dal primo giorno) è come indicizzare grandi gruppi di linee / poligoni di dimensioni arbitrarie. I dati dei punti non sono troppo difficili (vedi geohash, geomodel ecc.) Ma gli insiemi di poligoni piccoli / grandi raggruppati casualmente sono sempre stati un problema (e in alcuni casi lo sono ancora)
Ho provato diverse versioni dell'indicizzazione spaziale su GAE, ma la maggior parte sono solo varianti di due di seguito. Nessuno è stato veloce come i database SQL e tutti hanno vantaggi / svantaggi. i compromessi sembrano ragionevoli per la maggior parte delle app di mapping basate su Internet. Inoltre, i due seguenti devono essere accoppiati con l'abbattimento della geometria in memoria (tramite JTS ecc.) Per rimuovere tutte le funzionalità che non si adattano ai parametri di ricerca finali. e infine, si basano su funzionalità specifiche di GAE ma sono sicuro che potrebbe essere applicato ad altre architetture (o usare TyphoonAE per funzionare su un cluster linux, ec2 ecc.)
Griglie : comprime tutte le funzionalità di una determinata area in un indice di griglia noto. Posiziona un piccolo indice spaziale sulla griglia in modo da navigare rapidamente nel set di funzionalità che contiene. Per la maggior parte delle query, dovrai solo tirare una manciata di griglie che è veloce, poiché conosci l'esatta convenzione di denominazione della griglia e come è correlata alle entità K / V (ottiene, non query)
Pro : abbastanza veloce, facile da implementare, senza ingombro di memoria.
Contro : preelaborazione necessaria, l'utente deve decidere la dimensione della griglia, i geom di grandi dimensioni sono condivisi su più griglie, il clustering può causare il sovraccarico delle griglie, i costi di serializzazione / deserializzazione possono essere un problema (anche se compressi tramite buffer di protocollo)
QuadKeys : questa è l'implementazione attuale. fondamentalmente è uguale a Griglie tranne per il fatto che non esiste un livello di griglia impostato. man mano che le funzionalità vengono aggiunte, vengono indicizzate dalla griglia di quadkey che contiene completamente i loro limiti (o in alcuni casi, divisi in due quando non è possibile utilizzare un singolo quadkey, si pensi alla linea di dati). Dopo che il qk è stato trovato, viene quindi diviso in un numero massimo di qk più piccoli che forniscono rappresentazioni più dettagliate della funzione. un puntatore / bbox a quella funzione viene quindi impacchettato in un gridindex leggero (gruppo di funzionalità) che può essere interrogato (un design originale ha interrogato direttamente le funzionalità ma ciò si è rivelato troppo lento / intensivo della CPU nei casi in cui il set di risultati era grande)
Polilinea Quadkeys http://www.arc2earth.com/images/help/GAE_QKS_1.png
Poligono Quadkeys http://www.arc2earth.com/images/help/GAE_QKS_2.png
La convenzione di denominazione dei quadkey usata sopra è ben nota e, soprattutto, tende a preservare la località (descritta più qui )
Il poligono sopra è simile al seguente: 0320101013123 03201010131212 03201010131213 0320101013132 0320101013133 03201010131302 03201010131303 032010101313002 03201010101010101010101010101010101010101010101010101
se i limiti della query sono abbastanza piccoli, è possibile recuperare direttamente tramite qk. questo è ottimale poiché è solo una singola chiamata rpc in batch al datatore GAE. se i limiti sono abbastanza grandi da includere troppi qk possibili (> 1000), in alternativa puoi eseguire una query utilizzando un filtro (es: qk> = 0320101013 e qk <= 0320101013 + \ ufffd). La convenzione di denominazione quadkey più il modo in cui GAE indicizza le stringhe consente alla query sopra di recuperare solo le griglie esistenti che scendono al di sotto di quel valore qk.
ci sono altri avvertimenti e problemi di perf ma, in generale, è la possibilità di interrogare sui quadkey che lo rende possibile
esempi - query sulle contee statunitensi: geojson
Pro : abbastanza veloce, nessuna configurazione della dimensione della griglia, nessuna impronta di memoria, nessuna griglia sovraffollata
Contro : preelaborazione necessaria, possibile sovraccarico in alcuni scenari, nessun dato polare
Curve di riempimento dello spazio - Dai un'occhiata al discorso sulle query NextGen di Alfred quest'anno a Google I / O. L'inclusione di curve di riempimento spazio / tempo generiche insieme ai nuovi operatori MultiQuery (eseguiti in parallelo) consentirà alcune query spaziali davvero interessanti. Batterà le prestazioni SQL tradizionali? Difficile a dirsi ma dovrebbe ridimensionarsi davvero bene. E ci stiamo avvicinando rapidamente a un futuro in cui i dispositivi mobili sempre attivi di tutte le forme / dimensioni aumenteranno notevolmente il traffico verso il tuo sito / servizio.
infine, sarei anche d'accordo che dovresti esaminare molto attentamente il tuo dominio problematico prima di scegliere NoSQL su SQL. Nel nostro caso, mi è piaciuto molto il modello di prezzi di GAE, quindi non c'era davvero scelta, ma se non hai bisogno di ridimensionare, risparmia un po 'di tempo e usa semplicemente un sql db standard