PostGIS - Получить точки полигона геозоны в пределах 100 метров от существующей геозоны - PullRequest
1 голос
/ 18 июня 2019

Допустим, у меня есть полигон геозоны со следующими координатами

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

Я хотел бы иметь возможность генерировать еще один набор точек многоугольника из этого, который находится в радиусе 100 метров.Есть ли какая-либо формула для достижения этой цели?

Мой пример использования: если у меня есть существующий полигон геозоны, я хочу создать еще один полигон геозоны, окружающий его на расстоянии 100 метров.

IЯ использую следующий запрос для вставки данных в мою таблицу.Столбцы 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);

1 Ответ

1 голос
/ 18 июня 2019

Сначала координаты должны быть сначала выражены как долгота, а затем широта. Вам нужно поменять местами координаты при вводе

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...