今日SpatiaLiteを使い始めて、すでに問題に遭遇しました。
tableOneに保存されている各ポイントの場所について、tableTwoから最も近い(直線距離)ポイントを1つ選択します。
これまでのところ、VIEWを利用する不器用なソリューションを思い付きました。
CREATE VIEW testview AS
SELECT
A.id ,
B.myValue,
Distance(A.Geometry, B.Geometry) AS distance
FROM tableOne AS A, tableTwo AS B
WHERE distance < 10000
ORDER BY A.Id, distance;
その後:
SELECT * FROM testview
WHERE distance = (SELECT MIN(distance) FROM testview AS t WHERE t.id = testview.id)
仕事をするようです。
2つの質問:
ビューを作成せずにそのようなクエリを実行する方法はありますか?
パフォーマンスを向上させるためにこのクエリを最適化する他の方法はありますか?実際のシナリオでは、tableOneには数百から数千のレコードがあり、tableTwoには130万があります。
数桁速いアプローチを提供できますが、スペーシャルライトの代わりにpostgresql 9のknngistインデックスを使用する必要があります...
—
Ragi Yaser Burhum 2011年
実際には、GRASS、ArcGIS、QGIS、SQLServer、およびその他のほとんどの空間データベース/デスクトップGISよりも高速です(ただし、Oracleの最近傍機能は試していません)。
—
Ragi Yaser Burhum、2011年
@Ragi:PostGISがそのような問題を処理するはるかに効率的な方法であることを私は知っています。ただし、この演習の最終的な目標は、小さなポータブルアプリを作成することです。この場合、SpatiaLiteが勝者です。
—
radek、2011年
ポータブルアプリの開発プラットフォームは何ですか?
—
Allan Adair
@Allan:現在、Windows Server 2008とUbuntuの両方に取り組んでいます。
—
radek、2011年