Как преобразовать пару широта / долгота в тип географии PostGIS? - PullRequest
31 голосов
/ 26 марта 2010

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

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

update mytable set geography = ???

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

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

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

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

Ответы [ 3 ]

37 голосов
/ 26 марта 2010

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

8 голосов
/ 28 октября 2014

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

  1. Преобразование числовых столбцов long и lat в тип географии geog:

    UPDATE mytable SET geog = ST_SetSRID(ST_MakePoint(long, lat), 4326)::geography
    
  2. Преобразование геометрического столбца geom ( SRID = 4326 ) в тип географии geog с использованием простого приведения:

    UPDATE mytable SET geog = geom::geography
    
  3. Преобразовать прогнозируемый столбец геометрии geom в тип географии geog:

    UPDATE mytable SET geog = ST_Transform(geom, 4326)::geography
    

Обратите внимание, что последние два примера работают с любым типом геометрии. Кроме того, преобразование из геометрии в географию часто подразумевается, и эти примеры работают без ::geography, однако явное приведение обычно является хорошей практикой для этих вещей.

5 голосов
/ 05 сентября 2011

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

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

с или без Срид.

...