我使用postgresql作为db,我有一个名为car_wash的表,其字段为“point geometry”(使用postgis)所以在应用程序中我正在使用GOOGLE API从用户那里获取lon lat,下一步我需要创建一个圈子用户并检查我使用
这个圈内的car_wash select *
from car_wash cw
where
ST_DWithin (
cw.lon_lat,
ST_GeomFromText('POINT(54.21 22.54)')
)=false
AND
not cw.was_deleted
是核心方式吗?如果您需要我的srid根据此查询为0
Select Find_SRID('public', 'car_wash', 'lon_lat')
答案 0 :(得分:1)
使用ST_DWithin
功能时,您的第三个参数必须是距离。
您还可以在ST_GeomFromText
有两个简单的例子,所以你可以看到差异:
select ST_DWithin(
st_geomfromtext('POINT(54.51 22.54)',4326),
st_geomfromtext('POINT(54.21 22.54)',4326),0.5
)
result is true
select ST_DWithin(
st_geomfromtext('POINT(54.51 22.54)',4326),
st_geomfromtext('POINT(54.21 22.54)',4326),0.1
)
result is false
来源:
答案 1 :(得分:0)
首先 - 我假设lat_long是georaphy类型列。如果是几何类型列,则必须将我的示例修改为其他EPSG(整个世界可以为3857公制EPSG)。这非常重要,因为st_dwithin以米为单位检查地理位置类型,并以地图单位检查几何(以及EPSG 4326单位为度数而不是米)
像这样插入数据
insert into car_wash values (1,'aaa',st_setsrid(st_makepoint(54.51, 22.54),4326))
我解释为什么要使用st_setsrid,st_makepoint,以及到底是什么4326。 - 4326是EPSG 4326 - 它是最着名的坐标参考系统(你有纬度和长度)。
st_makepoint - 将根据您的纬度和长坐标创建地理点。它看起来像字节,但不要担心,如果你因为某些原因需要lat和long,你可以用st_x()和st_y()或st_astext()函数来获取它们。拥有geoms或geogs(在这种情况下)最好的是你可以使用gist索引。非常强大的工具,可以加速您的地理查询。
st_setsrid - st_makepoint将创建点,但srid = 0。您必须告诉POSTGIS它应该读取您的数据的EPSG。例如,如果你告诉他用4326阅读它将在谷歌世界地图上的正确位置,但如果你说例如3857它将在完全不同的地方,因为3857是公制系统而不是度数所以它将是大约50离左下角50米(或者可能是左边,不记得了)
在地理位置
上创建索引create index on car_wash using gist (geog);
我们有表,我们有数据和索引。现在我们要检查您的点是否接近任何洗车点。
select *
from car_wash cw
where ST_DWithin (cw.geog,ST_GeogFromtext('SRID=4326;POINT(54.21 22.54)'),1000)
AND cw.was_deleted=false
在ST_DWithin中,第三个参数是以米为单位的距离(georpahy)或地图单位(几何)。因此,在这种情况下,它会显示距离您的用户位置最远1000米的所有洗车,并且不会被删除。
答案 2 :(得分:-1)
ST_GeomFromText('POINT(54.21 22.54)')的SRID必须与cw.lon_lat的SRID相同。假设cw.lon_lat的SRID为4326,您可以使用ST_GeomFromText设置其他属性srib('POINT(54.21 22.54)',4326)。 其次,ST_DWithin需要缓冲距离作为第三个参数。因此,如果你想检查点是否在100米缓冲区内,它应该像
ST_DWithin (
cw.lon_lat,
ST_GeomFromText('POINT(54.21 22.54)', 3857), 100
)
缓冲区值取决于srid单位。如果是3857米。您需要将cw.lon_lat和POINT(54.21 22.54)转换为相同的SRID才能使用st_setSRID,例如。