Postgis: 错误:解析错误 - 无效的几何图形。

7

我正在使用POSTGIS="2.0.1 r9979",遇到以下错误:

ERROR:  parse error - invalid geometry
HINT:  "POINT(18.570275,7" <-- parse error at position 17 within geometry
CONTEXT:  SQL function "st_dwithin" during inlining

在尝试 SQL 时:

 SELECT addressid FROM maddress 
  WHERE ST_DWithin(geocode, 'POINT(20.0924758 72.7341809 19.137381,72.837223)' , 100.0);

我希望选择查询中提到的点之间的地址。

我已经检查了语法,并根据语法在查询中输入了值。请告诉我需要进行哪些更正。


你需要描述一下你是如何创建几何图形的,因为这就是错误的原因。 - Mike T
@MikeT。OP在评论中回答说,geocode实际上是分别表示纬度/经度字段,如果您查看POINT,则其中有一个逗号。因此,实际上有大约3个问题。 - John Powell
3个回答

8

当我使用以下代码时,遇到了相同的错误:

select ST_GeomFromText('POINT(-27.75 ,114.75)', 3857)

改为:

select ST_GeomFromText('POINT(-27.75 114.75)', 3857)

您需要删除逗号分隔符。

4

如果您想查找两个点之间的点,则可能需要使用ST_DWithin两次,以便获取基于点1和基于点2的圆的交集中的点,例如:

SELECT addressid FROM maddress 
WHERE ST_DWithin(geocode, ST_MakePoint(20.0924758, 72.7341809), 100.0)
AND ST_DWithin(geocode, ST_MakePoint(19.137381, 72.837223), 100.0);

请注意,单位为SRID单位,您的情况似乎是4326,因此您可能希望将坐标转换为米,使用地理数据类型,以便距离以米为单位,或者将距离转换为度数--有各种选择。我相信您已经看过ST_DWithin docs,其中解释了这些选项。您还可以考虑use_spheroid参数。
与其上面的ST_MakePoint不同,您也可以使用ST_GeomFromText,它采用形式“POINT(x y)”,因为您最初可以选择指定SRID,例如,使用4326,您也可以将查询编写为:
SELECT addressid FROM maddress 
WHERE ST_DWithin(geocode, ST_GeomFromText('POINT(20.0924758 72.7341809)',4326), 100.0)
AND ST_DWithin(geocode, ST_GeomFromText('POINT(19.137381 72.837223)', 4326), 100.0);

编辑 根据OP的评论,发现geocode不是一个几何列。你可以通过运行以下命令来解决这个问题。

ALTER TABLE maddress ADD COLUMN geom GEOMETRY  (POINT, 4326);
UPDATE maddress set geom=ST_MakePoint(lng,lat);
CREATE INDEX ix_spatial_geom on maddress using gist(geom);

您需要在上述查询中使用geom而不是geocode。我假设您的点位于4326。


1
抱歉,我的错,我在第二个里面留了一个逗号。句点必须用空格分开。我已经编辑了答案。 - John Powell
抱歉,我现在喝了一些咖啡。你需要使用ST_GeomFromText('POINT(x y)')或ST_MakePoint(x,y)。我已经更新了答案。 - John Powell
我尝试了第二个。表格有任何更改吗?我正在使用以前的PostgreSQL表格。我没有创建空间表。为什么会显示解析错误?需要进行任何解析器配置吗? - user3129056
我不确定我理解了。geocode是一个几何列,对吧?两种方法都可以,因为它们只是创建点的不同方式。 - John Powell
啊,你的问题表述不太清楚。如果你创建一个几何列并为其添加空间索引,那么ST_DWithin函数将会使用该索引,这样效果会好很多。 - John Powell
显示剩余5条评论

0

前往迁移并更改字段类型,如果您使用Leaflet:

  • django.contrib.gis.db.models.fields.MultiPointField

  • 从djgeojson.fields导入MultiPointField

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接