假设我有一个具有以下坐标的地理围栏多边形
POLYGON((-36.861986 174.726745,-36.859241 174.730442,-36.859821 174.730976,-36.862321 174.728156,-36.861986 174.726745))
我希望能够由此生成半径在100米以内的另一组多边形点。有什么公式可以实现这一目标吗?
我的用例是,如果我有一个现有的Geofence多边形,我想在100米的距离内创建另一个围绕它的Geofence多边形。
我正在使用以下查询将数据插入表中。 “ geofence”和“ geofence_buffer”列的类型为geography。名称为“ geography”的列的类型为text。我只是将其用作快速参考。
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);
答案 0 :(得分:1)
首先,必须先将坐标表示为经度,然后再将其表示为纬度。您需要在输入中交换坐标
POLYGON(( 174.726745 -36.861986, 174.730442 -36.859241, 174.730976 -36.859821, 174.728156 -36.862321, 174.726745 -36.861986))
然后,您可以使用ST_BUFFER
在多边形周围创建缓冲区。要在以经度/纬度为坐标时以米为单位指定距离,最简单的方法是将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
返回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;