с использованием буфера и трансформирующей проекции, PostGIS

Я создаю буфер и пытаюсь преобразовать свой 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 моей таблицы точек и всех других таблиц в моей базе данных.


person sTonystork    schedule 22.04.2020    source источник


Ответы (1)


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

Почти в каждом сделанном предположении есть ошибка.

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

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)

Бинго, это результат, который вы получаете.
==> Во-первых, либо исправьте используемую вами 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
person JGH    schedule 23.04.2020
comment
Я пробовал это решение, но при первом преобразовании получаю сообщение об ошибке: функция st_transform (география, целое число) не существует. CREATE TABLE intrsct_buff AS ( SELECT ST_Transform( ST_Buffer( ST_Transform(pt.geom,4326)::geography, 30.0), 2263) as geom, pt.count FROM public.intrsct_pts as pt ); Я предполагаю, что это говорит о том, что мне нужен еще один аргумент в первой функции ST_Transform (___, 2263) - person sTonystork; 23.04.2020
comment
нет, значит вы допустили очередную ошибку в своих предположениях (и это подтверждает данные не за 2263 год). Пробовать формулы в случайном порядке — это рецепт неудачи... опять же, остановитесь, посмотрите, что у вас есть, чего вы хотите, и только потом, что нужно сделать, чтобы это получить. - person JGH; 23.04.2020
comment
Также помните, что вложенные функции работают изнутри наружу. Преобразование в 2263 применяется ПОСЛЕДНИМ. - person JGH; 23.04.2020
comment
Я использовал команду SELECT st_asText.... в своей таблице точек с SRID 2263 и POINT(-73.738910836855 40.5959372736193), которые являются правильными точками при построении графика. Итак, мои исходные данные - 2263. - person sTonystork; 23.04.2020
comment
Я понимаю вложенную функцию, код: 1) преобразование проекции точечных данных в новый географический SRID 2) буферизация географических точек SRID на 30 м в каждом направлении 3) повторное проецирование обратно на 2263 . Нужно ли звонить по географии до SRID 2263? - person sTonystork; 23.04.2020
comment
Эта координата в 2263 году будет POINT(1056757.91381836 156500.482604925) - person JGH; 23.04.2020