2018年6月17日日曜日

PostGisを1.5.3から2.0にアップデートしたときに発生したSQLエラー対応


PostGisを1.5.3から2.0にアップデートしたときに、既存のpostgisからデータを取得するSQLで下記のようなエラーが発生。


1. GeometryFromText 指定名称、指定引数型に合う関数がありません。明示的な型キャストが必要かもしれません
2. 関数geometryfromtext(unknown, integer)は存在しません
3. 関数expand_sphere_pseudo(geometry, integer)は存在しません
4. リレーション spatial_ref_sys への権限がありません


もともとPostgis1.5.3で実際に流していたSQLは以下のようなもの

SELECT
/*省略*/
trunc(distance_sphere(A.geo, GeometryFromText('POINT(139.000 35.000)', 4326))) as DISTANCE
FROM
/*省略*/
WHERE
expand_sphere_pseudo(GeomFromText('POINT(139.000 35.000)', 4326), 1000) && A.geo
AND distance_sphere(A.geo, GeometryFromText('POINT(139.000 35.000)', 4326)) < 1000
上記で、半径1000m以内のデータを取得していた。DISTANCEには、現在地からの距離。



1については、そもそもGeometryFromTextという関数がなくなっていた。
Postgis2.0では、ST_GeomFromTextを代わりに利用する模様。


2,3の関数geometryfromtextとdistance_sphereを使って、半径1000m以内のデータを取得しようとしていた処理では
ST_DWithinという関数を使って実現する。


最終的なPostgis2.0に対応したSQLは以下で結果が正常に返ってきた
SELECT
/*省略*/
trunc(ST_Distance(A.geo, ST_GeomFromText('POINT(139.000 35.000)', 4326))) as DISTANCE
FROM
/*省略*/
WHERE
ST_DWithin(A.geo, ST_GeomFromText('POINT(139.000 35.000)', 4326), 1000,true)




リレーション spatial_ref_sys への権限がありません
というエラーについては
/usr/share/pgsql/contrib/postgis-2.0/spatial_ref_sys.sql
上記のSQLを流すことで解決
psql -U postgres db名 -f /usr/share/pgsql/contrib/postgis-2.0/spatial_ref_sys.sql