PostGIS - 获取现有地理围栏 100 米范围内的地理围栏多边形点

PostGIS - Get geofence polygon points within 100 metres of an existing geofence

假设我有一个具有以下坐标的地理围栏多边形

POLYGON((-36.861986 174.726745,-36.859241 174.730442,-36.859821 174.730976,-36.862321 174.728156,-36.861986 174.726745))

我希望能够从中生成另一组 100 米半径内的多边形点。有什么公式可以实现吗?

我的用例是,如果我有一个现有的地理围栏多边形,我想在它周围 100 米的距离内创建另一个地理围栏多边形。

我正在使用以下查询将数据插入我的 table。 'geofence' 和 'geofence_buffer' 列属于地理类型。名称为 'geography' 的列是文本类型。我只是用它作为快速参考。

insert into site(name,status,client_id,geofence_type,geography_drawn,geofence,geofence_buffer)
values('Fanshawe','Active',1,1,'POLYGON((-36.849530 174.760984,-36.839295 174.763729,-36.841696 174.779093,-36.854061 174.774291,-36.849530 174.760984))',
      'SRID=4267;POLYGON((-36.849530 174.760984,-36.839295 174.763729,-36.841696 174.779093,-36.854061 174.774291,-36.849530 174.760984))',
      (select ST_Buffer(ST_GeographyFromText('SRID=4267;POLYGON((-36.849530 174.760984,-36.839295 174.763729,-36.841696 174.779093,-36.854061 174.774291,-36.849530 174.760984))'),100)));

数据插入得很好但是当我运行下面的查询来查找geofence_buffer中是否存在一个点时,我得到下面的错误。

NOTICE:  Coordinate values were coerced into range [-180 -90, 180 90] for GEOGRAPHY
LINE 1: ...ect * from site where ST_DWithin(geofence_buffer, 'SRID=4267...
                                                             ^
ERROR:  Operation on mixed SRID geometries
SQL state: XX000

我使用的查询是

select * from site where ST_DWithin(geofence_buffer, 'SRID=4267;POINT(-36.848362 174.764417)',0.0,false);

但是,如果我像这样在地理围栏内查询,那么一切正常。

select * from site where ST_DWithin(geofence, 'SRID=4267;POINT(-36.848362 174.764417)',0.0,false);

首先,坐标必须先用经度表示,再用纬度表示。您需要交换输入中的坐标

POLYGON(( 174.726745 -36.861986, 174.730442 -36.859241, 174.730976 -36.859821, 174.728156 -36.862321, 174.726745 -36.861986))

然后您可以使用 ST_BUFFER 在您的多边形周围创建一个缓冲区。要在 lat/long 中指定以米为单位的距离,最简单的方法是将 geometry 转换为 geography

with src as (select st_geomFromText('POLYGON(( 174.726745 -36.861986, 174.730442 -36.859241, 174.730976 -36.859821, 174.728156 -36.862321, 174.726745 -36.861986))') geom)
select st_buffer(geom::geography,100)::geometry 
from src;

由于您的数据不在 4326 中而是在 4267 中,并且 st_buffer returns 地理区域在 4326 中,您将不得不重新投影:

with src as (select st_geomFromText('POLYGON(( 174.726745 -36.861986, 174.730442 -36.859241, 174.730976 -36.859821, 174.728156 -36.862321, 174.726745 -36.861986))') geom)
select ST_Transform(st_buffer(geom::geography,100)::geometry,4267) 
from src;