используя буфер и трансформирующую проекцию, PostGIS - PullRequest
0 голосов
/ 23 апреля 2020

Я создаю буфер и пытаюсь преобразовать мой SRID в geog, а затем обратно в исходную проекцию и geom. У моего слоя точек есть мое соглашение WKT:

POINT (-73.73891083685496 40.59593727361931)

CREATE TABLE intrsct_buff AS ( 
  SELECT
    ST_Transform(ST_Buffer(ST_Transform(pt.geom,2263), 60),4326) as geom, pt.count
  FROM public.intrsct_pts as pt
);

Но когда я использую этот код, моя новая буферная таблица имеет этот WKT:

POLYGON ((-77.51963927750339 40.11249512168173..

Я использую неправильный SRID для географии? WGS84 = 4326. Проекция, в которой он должен находиться, равна 2263, поскольку это SRID моей таблицы баллов и всех других таблиц в моей базе данных.

1 Ответ

0 голосов
/ 23 апреля 2020

В таких случаях возьмите бумагу и ручку и запишите, что вам нужно (вход) и что вы ожидаете (выход) для КАЖДОГО задействованного шага.

Существует ошибка почти в каждом предположении made.

1) Geography - это не то же самое, что Geometry. В то время как оба используют WGS84 4326 CRS, первое устройство указывается в метрах, а второе - в градусах. В первом используются дуги большого круга, а в последнем используются прямые линии для соединения двух точек (вычисление расстояний, пересечение и т. Д. c сильно затронуты на больших расстояниях)

2) Вы говорите, что ваши данные находятся в CRS 2263 (Нью-Йорк Лонг-Айленд (ftUS)), который имеет следующие границы:

WGS84 Границы: -74.2700, 40.4700, -71.7500, 41.3100
Прогнозируемые границы: 909126.0155, 110626.2880 , 1610215.3590, 424498.0529

Отображаемые вами координаты находятся не в этом CRS, а, скорее всего, в WGS84.

Давайте проверим это предположение: если мы (ошибочно) предположим, что координаты, которые вы предоставили в 2263 году, что произойдет, если мы спроецируем их на 4326?

select st_asText(st_transform(st_geomFromEWKT('SRID=2263;POINT (-73.73891083685496 40.59593727361931)'),4326));
                st_astext
------------------------------------------
 POINT(-77.5198536012811 40.112488506058)

Корзина go, это результат, который вы получаете.
==> Сначала исправьте используемый CRS или координаты. Один из них неверен.

Но даже если бы у вас был правильный CRS, запрос не работал бы так, как предполагалось.

Вы говорите, что хотите: 1) изменить точку на географию, 2 ) буферизуйте его на 60 метров, 3) конвертируйте обратно в исходный CRS.

То, что вы сделали, было 1) измените точку на 2263 (она уже в CRS, она не имеет никакого эффекта) 2) буфер на 60 футов 3) преобразовать в WGS84 (геометрия)

Чтобы достичь того, что вы описали, скорее всего:

SELECT ST_Transform(
     ST_Buffer(
      ST_Transform(pt.geom,4326)::geography, -- change to 4326 and cast to geography
      60), -- buffer 60 meters
    2263) as geom -- change back to original CRS
...