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