So I want to add 20 points, run Spatialite knn and find 10 points. I created a simple test in colaboratory:
import os
from datetime import datetime
import json
from pprint import pprint
from playhouse.sqlite_ext import *
from peewee import *
from playhouse.kv import *
from playhouse.shortcuts import model_to_dict
from playhouse.reflection import generate_models, print_model, print_table_sql
from IPython.display import SVG
import folium
db = SqliteExtDatabase('./my_database.db')
db.connect()
db.connection().enable_load_extension(True)
print(db.execute_sql("SELECT load_extension('mod_spatialite.so');").fetchall())
print(db.execute_sql("SELECT InitSpatialMetaData(); ").fetchall())
print(db.execute_sql("SELECT sqlite_version(), spatialite_version();").fetchall())
#print(db.execute_sql("CREATE VIRTUAL TABLE knn2 USING VirtualKNN2();").fetchall())
class BaseModel(Model):
class Meta:
database = db
class GeometryField(Field):
db_field = 'geometry'
def geometryFromWKT(wellknowntext):
return fn.ST_GeomFromText(wellknowntext)
class Tbl(BaseModel):
geometry = GeometryField()
models = generate_models(db)
Tbl.create_table()
Tbl.insert(geometry=geometryFromWKT('POINT(4 9)')).execute()
Tbl.insert(geometry=geometryFromWKT('POINT(9 9)')).execute()
Tbl.insert(geometry=geometryFromWKT('POINT(14 9)')).execute()
Tbl.insert(geometry=geometryFromWKT('POINT(4 19)')).execute()
Tbl.insert(geometry=geometryFromWKT('POINT(41 9)')).execute()
Tbl.insert(geometry=geometryFromWKT('POINT(14 19)')).execute()
cmd = """SELECT AsGeoJSON(ST_Union(CastToXY(geometry)), 5, 3) from Tbl"""
data_all = db.execute_sql(cmd).fetchall()[0][0]
print(data_all)
cmd = """SELECT * FROM knn
WHERE f_table_name = 'Tbl' AND ref_geometry = GeomFromText('POINT(5 5)') AND f_geometry_column = 'geometry' AND max_items = 2;"""
data_knn = db.execute_sql(cmd).fetchall()
print(data_knn)
Yet it finds 0 points outputting:
[('3.34.0', '5.0.1')]
{"type":"MultiPoint","bbox":[4,9,41,19],"coordinates":[[4,9],[4,19],[9,9],[14,9],[14,19],[41,9]]}
[]
Similar thing happens to me if I use knn2
here. 0 points after some are definitely inserted. Insertion is performed in the same style ref_geometry
is provided. And I do not understand how I my simple table is not compatible with knn. So how to insert points, do knn search in Spatialite?