Ответ 1
... Вздох. Глупость с моей стороны. По-видимому, правильный порядок - долгота, широта. Меня обманули, думая, что обе координаты имеют одинаковый диапазон (от -180 до 180), поэтому считалось что-то более тонкое.
Я пытаюсь загрузить кучу пар широты/долготы в тип географии PostGIS, чтобы иметь возможность запрашивать по местоположению.
В частности, у меня есть таблица с столбцами широты и долготы float и столбец geography(Point, 4326)
. Я хотел бы сделать
update mytable set geography = ???
В документации предполагается, что следующее должно работать:
update mytable set geography = ST_GeogFromText('POINT(' || latitude || ' ' ||
longitude || ')');
Это не так. Я не знаю, что это интерпретирует эту точку как значение, но это позволяет только долготу лежать между -90 и 90, поэтому она явно не долгота.
Итак, что мне делать?
... Вздох. Глупость с моей стороны. По-видимому, правильный порядок - долгота, широта. Меня обманули, думая, что обе координаты имеют одинаковый диапазон (от -180 до 180), поэтому считалось что-то более тонкое.
Чтобы выполнить обмен между lat и lng, вы можете использовать:
update mytable set geography = ST_GeographyFromText('SRID=4326;POINT(' || st_x(geom) || ' ' || st_y(geom) || ')');
с или без srid.
Вот несколько способов создания типов географии:
Преобразовать числовые столбцы long
и lat
в тип географии geog
:
UPDATE mytable SET geog = ST_SetSRID(ST_MakePoint(long, lat), 4326)::geography
Преобразуйте столбец геометрии geom
(SRID = 4326) в тип географии geog
, используя простой приведение:
UPDATE mytable SET geog = geom::geography
Преобразовать проецируемый столбец геометрии geom
в тип географии geog
:
UPDATE mytable SET geog = ST_Transform(geom, 4326)::geography
Обратите внимание, что последние два примера работают с любым типом геометрии. Кроме того, преобразование из геометрии в географию часто неявно, и эти примеры работают без ::geography
, однако явные приведения обычно являются хорошей практикой для этих вещей.