PostGIS:如何将点列转换为ST_DWithin可以使用的类型?

问题描述 投票:0回答:1

我有以下查询来尝试获取所提供点范围内的地点总数,并与我的地点表进行比较。所有地方都有一个

geo
列,定义为
geo point default null

select
  count(*)
from
  places
where
  ST_DWithin(
    ST_GeomFromText(concat('POINT', geo::text), 4326),
    ST_GeomFromText('POINT(37.64903402157866, -83.84765625000001)', 4326),
    66 * 1609.34
  );

但是,返回:

parse error - invalid geometry

我尝试使用其他函数转换为::geometry,但没有任何效果。我的数据如下所示:

select geo, geo::text, geo::geometry from places where geo is not null limit 10

返回:

{"x":-84.3871,"y":33.7485}
(-84.3871,33.7485)
01010000000612143FC61855C02B8716D9CEDF4040

我做错了什么吗?我应该更改表并存储另一种列类型吗?如何才能不丢失现有数据?

postgresql postgis
1个回答
0
投票

这里一切都是错误的。

类型:您有 postgres 原生

point
类型,Postgis 无法使用该类型。您很可能想要
geometry(point)

转换:幸运的是,您可以简单地从点转换为几何图形:

select point_column::geometry from mytable;

坐标顺序:在Postgis中,坐标通常表示为先经度,后纬度。在您的示例中,列采用长纬度,而硬编码几何体采用纬度-长。

坐标系:您的数据似乎没有投影。您可以使用指定这一点的列,因此使用

point_column::geometry(point,4326)
进行投射。

4326 中的距离:不要计算 4326 中的距离。它们没有意义。经度与纬度的地面长度(以米为单位)不同。 相反,您必须使用合适的局部投影来保留距离或使用

geography
类型,但要注意其含义,尤其是在长距离上。

© www.soinside.com 2019 - 2024. All rights reserved.