我有以下查询来尝试获取所提供点范围内的地点总数,并与我的地点表进行比较。所有地方都有一个
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
我做错了什么吗?我应该更改表并存储另一种列类型吗?如何才能不丢失现有数据?
这里一切都是错误的。
类型:您有 postgres 原生
point
类型,Postgis 无法使用该类型。您很可能想要 geometry(point)
转换:幸运的是,您可以简单地从点转换为几何图形:
select point_column::geometry from mytable;
坐标顺序:在Postgis中,坐标通常表示为先经度,后纬度。在您的示例中,列采用长纬度,而硬编码几何体采用纬度-长。
坐标系:您的数据似乎没有投影。您可以使用指定这一点的列,因此使用
point_column::geometry(point,4326)
进行投射。
4326 中的距离:不要计算 4326 中的距离。它们没有意义。经度与纬度的地面长度(以米为单位)不同。 相反,您必须使用合适的局部投影来保留距离或使用
geography
类型,但要注意其含义,尤其是在长距离上。