formula - PostGIS - 获取现有地理围栏 100 米内的地理围栏多边形点
问题描述
假设我有一个地理围栏多边形,其坐标如下
POLYGON((-36.861986 174.726745,-36.859241 174.730442,-36.859821 174.730976,-36.862321 174.728156,-36.861986 174.726745))
我希望能够从中生成另一组 100 米半径内的多边形点。有什么公式可以实现这一点吗?
我的用例是,如果我有一个现有的地理围栏多边形,我想在 100 米的距离内创建另一个地理围栏多边形。
我正在使用以下查询将数据插入到我的表中。'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
在你的多边形周围创建一个缓冲区。要指定以米为单位的距离,同时具有纬度/经度坐标,最容易转换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;
推荐阅读
- javascript - 使用带双引号的数据值属性的 jQuery 选择器
- grails - Grails 3.3.11 中的集成测试不回滚
- c# - ASP.NET Gridview - 代码中的动态 - 非空数据表作为源 - DataBind 引发异常
- modelica - Modelica 可扩展连接器最佳实践
- python-3.x - 运行 GridSearchCV 时超时或内存泄漏
- google-sheets - SUMIF 的多个标准无法正常工作
- c - 在 C 中,如何正确使用 isalnum() 和 isxdigit() ?
- angular - Angular 9 无法使用 AWS S3 和 Cloudfront 加载模块脚本
- javascript - Thymeleaf 页面如何检查用户是否登录
- javascript - TypeError:“RequestInitializerDict”上“headers”字段的类型不正确:提供的值不是“variant”类型