postgresql postgis如果点在圈内

时间:2017-06-09 05:37:42

标签: postgresql distance postgis

我使用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')

3 个答案:

答案 0 :(得分:1)

使用ST_DWithin功能时,您的第三个参数必须是距离。 您还可以在ST_GeomFromText

中定义srid

有两个简单的例子,所以你可以看到差异:

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

来源:

https://postgis.net/docs/ST_DWithin.html

http://postgis.org/docs/ST_GeomFromText.html

答案 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,例如。