Mehr

Spatialite, NULL bei Verwendung von Distance


Wenn ich Spatialite verwende, kann ich keine Entfernungsabfrage ausführen. Ich habe versucht, die in der Datenbank gespeicherten Daten zu untersuchen, aber es scheint nicht mit meiner Datenbank zu tun zu haben. Wenn ich laufeEntfernungAbfrage auf zwei Koordinaten, gibt es sogar einen Unterschied zwischen der CLI und der Verwendung der C-Bibliothek.

Die richtige Antwort wird von der CLI (erstellt mit Homebrew unter OS X) gegeben:

$ Spatialite SpatiaLite Version… : 4.2.0 Unterstützte Erweiterungen: - 'VirtualShape' [direkter Shapefile-Zugriff] - 'VirtualDbf' [direkter DBF-Zugriff] - 'VirtualXL' [direkter XLS-Zugriff] - 'VirtualText' [direkter CSV/TXT-Zugriff] - 'VirtualNetwork' [Dijkstra kürzester Pfad] - 'RTree' [Räumlicher Index - R*Tree] - 'MbrCache' [Räumlicher Index - MBR-Cache] - 'VirtualSpatialIndex' [R*Tree-Metahandler] - 'VirtualXPath' [XML Path Language - XPath] - 'VirtualFDO' [FDO-OGR-Interoperabilität] - 'VirtualGPKG' [OGC GeoPackage-Interoperabilität] - 'VirtualBBox' [BoundingBox-Tabellen] - 'SpatiaLite' [Spatial SQL - OGC] PROJ.4-Version… : Rel. 4.8.0, 6. März 2012 GEOS Version… : 3.4.2-CAPI-1.8.2 r3921 TARGET CPU… : x86_64-apple-darwin14.1.0 die SPATIAL_REF_SYS Tabelle enthält bereits einige Zeilen SQLite Version… : 3.8.8.2 Spatialite > SELECT Distance(MakePoint(-73.995, 41.145556, 4326), MakePoint(-122.416667, 37.783333, 4326), 0); 4119935.70473556

Wenn ich dies jedoch aus meinem Code mit der C-Bibliothek mache, ist die Antwort NULL:

SpatiaLite Version… : 4.2.0 Unterstützte Erweiterungen: - 'VirtualShape' [direkter Shapefile-Zugriff] - 'VirtualDbf' [direkter DBF-Zugriff] - 'VirtualText' [direkter CSV/TXT-Zugriff] - 'VirtualNetwork' [Dijkstra kürzester Pfad] - ' RTree' [Räumlicher Index - R*Tree] - 'MbrCache' [Räumlicher Index - MBR-Cache] - 'VirtualSpatialIndex' [R*Tree-Metahandler] - 'VirtualFDO' [FDO-OGR-Interoperabilität] - 'VirtualGPKG' [OGC GeoPackage Interoperabilität] - 'VirtualBBox' [BoundingBox-Tabellen] - 'SpatiaLite' [Spatial SQL - OGC] PROJ.4 Version… : rel. 4.8.0, 6. März 2012 GEOS Version… : 3.4.2-CAPI-1.8.2 r0 ZIEL CPU… : x86_64-apple-darwin14.0.0 (sqlite3_column_type(… ) == SQLITE_NULL) == true

Was muss ich ändern, um eine gültige Entfernungsberechnung zu erhalten?


Sandro Furieri, der Autor von Spatialite, erklärt in diesem Beitrag, wie man Spatialite richtig initialisiert:

Die Initialisierung des "neuen Stils" sieht also wie folgt aus:

  1. zuerst aufrufenSpatialite_alloc_connection()Dadurch wird ein unabhängiges "Verbindungsobjekt" erstellt, das jede threadspezifische Speicherzuweisung enthält. (einschließlich XML- und GEOS-interner Caches)
  2. Dann ruf ansqlite3_open_v2()um eine physikalische Verbindung zu einer DB-Datei herzustellen
  3. dann rufe aufSpatialite_init_ex()um die SpatiaLite-Erweiterung zu registrieren
  4. … Durchführung aller anderen erforderlichen Prozesse (kundenspezifische Implementierung)
  5. am Ende des Prozessaufrufssqlite3_close()wie gewöhnlich.
  6. dann rufe aufSpatialite_cleanup_ex()um die SpatiaLite-Erweiterung abzumelden.
  7. und schließlich aufrufenSpatialite_free_internal_cache()Dadurch wird jede zugehörige Speicherzuordnung freigegeben.

Ich habe beim Durchlaufen des Spatialite-Codes festgestellt, dass irgendwann das interne "Verbindungsobjekt" falsch referenziert wurde. In meinem Code habe ich den falschen Zeiger übergeben, was schließlich zum NULL-Wert führte.


Schau das Video: Spatialite GUI - SQLite - Explore Data and Visualize Geometry from Spatialite GUI - Part VI (Oktober 2021).