Подтвердить что ты не робот

Как преобразовать пару широты/долготы в тип географии PostGIS?

Я пытаюсь загрузить кучу пар широты/долготы в тип географии PostGIS, чтобы иметь возможность запрашивать по местоположению.

В частности, у меня есть таблица с столбцами широты и долготы float и столбец geography(Point, 4326). Я хотел бы сделать

update mytable set geography = ???

В документации предполагается, что следующее должно работать:

update mytable set geography = ST_GeogFromText('POINT(' || latitude || ' ' ||
                                                           longitude || ')');

Это не так. Я не знаю, что это интерпретирует эту точку как значение, но это позволяет только долготу лежать между -90 и 90, поэтому она явно не долгота.

Итак, что мне делать?

4b9b3361

Ответ 1

... Вздох. Глупость с моей стороны. По-видимому, правильный порядок - долгота, широта. Меня обманули, думая, что обе координаты имеют одинаковый диапазон (от -180 до 180), поэтому считалось что-то более тонкое.

Ответ 2

Чтобы выполнить обмен между lat и lng, вы можете использовать:

update mytable set geography = ST_GeographyFromText('SRID=4326;POINT(' || st_x(geom) || ' ' ||  st_y(geom) || ')');

с или без srid.

Ответ 3

Вот несколько способов создания типов географии:

  • Преобразовать числовые столбцы 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, однако явные приведения обычно являются хорошей практикой для этих вещей.