[Gfoss] Spatialite cookbook

a.furieri a lqt.it a.furieri a lqt.it
Mer 12 Feb 2014 23:26:05 CET


On Wed, 12 Feb 2014 13:10:11 -0800 (PST), Beppe wrote:
> Salve a tutti,
> sto studiando spatialite su "Spatialite cookbook" e arrivato alla 
> ricetta
> #10 mi sono reso conto che alcune funzionalità sono incompatibili con 
> la
> versione più recente di Spatialite che sto usando...
> Attualmente sono arrivato alla ricetta #15 e non riesco a capire il 
> modo per
> far funzionare la seguente query:
>
> SELECT pp1.name AS "PopulatedPlace #1",
>   GeodesicLength(
>     MakeLine(pp1.geometry, pp2.geometry))
>       AS "Distance (meters)",
>   pp2.name AS "PopulatedPlace #2"
> FROM populated_places AS pp1,
>   populated_places AS pp2
> WHERE GeodesicLength(
>     MakeLine(pp1.geometry, pp2.geometry)) < 1000.0
>   AND pp1.id <> pp2.id
>   AND pp2.ROWID IN (
>     SELECT pkid
>     FROM idx_populated_places_geometry
>     WHERE pkid MATCH RTreeDistWithin(
>       ST_X(pp1.geometry),
>       ST_Y(pp1.geometry), 0.02))
> ORDER BY 2
>
> Qualcuno potrebbe aiutarmi?
>

ciao Beppe,

effettivamente il cookbook inizia ad invecchiare qua e la, specie
dove c'e' in ballo uno Spatial Index.

le subqueries basate sul meccanismo "WHERE ... MATCH ..." erano
quanto di meglio avevamo a disposizione qualche anno fa.
nel frattempo sono state deprecate (e definitivamente rimosse
dal codice) perche' alla prova dei fatti creavano un sacco di
problemi.

attualmente si usa la nuova interfaccia SpatialIndex, che trovi
descritta in dettaglio in questo documento:
https://www.gaia-gis.it/fossil/libspatialite/wiki?name=SpatialIndex

quindi seguendo le ultime evoluzioni ora quella query diventa:

SELECT pp1.name AS "PopulatedPlace #1",
   GeodesicLength(
     MakeLine(pp1.geometry, pp2.geometry))
       AS "Distance (meters)",
   pp2.name AS "PopulatedPlace #2"
FROM populated_places AS pp1,
   populated_places AS pp2
WHERE GeodesicLength(
     MakeLine(pp1.geometry, pp2.geometry)) < 1000.0
   AND pp1.id <> pp2.id
   AND pp2.ROWID IN (
     SELECT rowid FROM SpatialIndex
     WHERE f_table_name = 'populated_places'
       AND search_frame = ST_Buffer(pp1.geometry, 0.02))
ORDER BY 2

ciao Sandro


Maggiori informazioni sulla lista Gfoss