Як вставити полігон GeoJSON в таблицю PostGIS?


33

Мені потрібно вставити багатокутник від GeoJSON до моєї таблиці PostGIS. Так виглядає запит SQL.

INSERT INTO tablename (name, polygon)
VALUES (
    'Name',
    ST_GeomFromGeoJSON(
        '{
            "type": "Polygon",
            "coordinates": [
                [7.734375,51.835777520452],
                [3.8671875,48.341646172375],
                [7.20703125,43.580390855608],
                [18.6328125,43.834526782237],
                [17.9296875,50.289339253292],
                [13.7109375,54.059387886624],
                [7.734375,51.835777520452]
            ]
        }'
    )
)

На жаль, я отримую повідомлення про помилку.

ERROR:  Geometry SRID (0) does not match column SRID (3857)

GeoJSON вже в правильній системі відліку. Але це не вказано. Як вказати SRID в GeoJSON? Як повинен виглядати GeoJSON?

Оновлення: Коли я обернути геометрію , створену ST_GeomFromGeoJSONз ST_SetSRID(..., 3857)його кидає іншу помилку. На мій погляд, не здається, що геометрія має розмірність Z.

ERROR:  Geometry has Z dimension but column does not

Я думаю, вам потрібно вказати, що таблиця має srid: 4326, виглядає, що у вашій таблиці є srid: 3857, але ваш geojson має довгу / широту (тобто srid: 4326 або WGS84)
Gery

Я хочу використовувати 3857. Як повинен виглядати GeoJSON тоді?
danijar

Відповіді:


32

Переглянувши вихідний код PostGIS, я дізнався, як він розбирає SRID. Ось правильний спосіб вказати SRID в GeoJSON.

Специфікація GeoJSON говорить, що координати багатокутника є масивом лінійних рядків. Тому мені довелося обмотати їх додатковими дужками.

{
    "type":"Polygon",
    "coordinates":
    [
        [
            [-91.23046875,45.460130637921],
            [-79.8046875,49.837982453085],
            [-69.08203125,43.452918893555],
            [-88.2421875,32.694865977875],
            [-91.23046875,45.460130637921]
        ]
    ],
    "crs":{"type":"name","properties":{"name":"EPSG:3857"}}
}

16

Є кілька проблем із вашим JSON.

  1. По-перше, координати повинні бути масивом масивів.
  2. По-друге, дивлячись на координати, схоже, що значення є Latlong в географічній системі координат, швидше за все, EPSG: 4326. Це потім потрібно перетворити на EPSG: 3857.

Після виправлення цих двох речей ви можете вставити рядок, використовуючи наступний SQL-запит:

INSERT INTO "Parcels"("Name", the_geom)
    VALUES ('Corrected_Shape', 
    ST_TRANSFORM(ST_GeomFromGeoJSON('{
    "type":"Polygon",
    "coordinates":[[
        [-91.23046875,45.460130637921],
        [-79.8046875,49.837982453085],
        [-69.08203125,43.452918893555],
        [-88.2421875,32.694865977875],
        [-91.23046875,45.460130637921]
    ]],
    "crs":{"type":"name","properties":{"name":"EPSG:4326"}}
}'),3857));

Якщо це не працює (тобто ви все ще отримуєте помилку з Z diemsnion), будь ласка, оновіть це питання за допомогою версії PostGis та створення заяви про вашу таблицю.


Чому, на вашу думку, координати відсутні в EPSG: 3857?
danijar

3
Тому що одиниці EPSG: 3857 є (псевдо) метрами, а походження знаходиться в Атлантичному океані. У вас не було б 6 десяткової точності з метрами, і ці дані лежали б в Атлантичному океані біля узбережжя Африки.
Devdatta Tengshe

Координати вводяться на карті і мають багато десятків. Для тестування я намалював ділянку в Атлантичному океані поблизу Африки. Але завдяки вам я можу вдосконалити карту, щоб округлити координати на цілі метри.
danijar

@danijar: Тоді все в порядку. Якби ці координати були в EPSG: 4326, то вона лежала б над східними штатами США.
Devdatta Tengshe

5

ваш geojson повинен мати замість значень UTM, ви можете перетворити це за допомогою Proj або інших онлайн-інструментів, але ви можете це зробити легко і безпосередньо з postgis перед тим, як вставити його в свою таблицю, спробуйте це (не перевірено):

SELECT ST_AsText(ST_Transform(ST_GeomFromGeoJSON
    (
        {
            "type":"Polygon",
            "coordinates":[
                [7.734375,51.835777520452],
                [3.8671875,48.341646172375],
                [7.20703125,43.580390855608],
                [18.6328125,43.834526782237],
                [17.9296875,50.289339253292],
                [13.7109375,54.059387886624],
                [7.734375,51.835777520452]
            ]
        }
    ),4326),3857));

Отже, ви пропонуєте конвертувати SRID з 4326 до 3857? Тоді я міг би безпосередньо спробувати ST_Transform (ST_SetSRID (..., 4326), 3857), не можу? Навіщо потрібен цей додатковий крок трансформації?
danijar

Я думаю, вам слід перевірити те, що ви просите, ймовірно, те, що ви пропонуєте, - це єдиний крок, який вам потрібен, спробуйте і опублікуйте те, що у вас є
Гері

Це те, що я отримую. ERROR: transform: couldn't project point (9.25253e-302 6.08985e+159 1.18576e-322): latitude or longitude exceeded limits (-14)
danijar

3
INSERT INTO tablename (name, polygon)
VALUES
(
    'Name',
    ST_GeomFromGeoJSON
    (
        '{
            "type":"Polygon",
            "coordinates":[
                [7.734375,51.835777520452],
                [3.8671875,48.341646172375],
                [7.20703125,43.580390855608],
                [18.6328125,43.834526782237],
                [17.9296875,50.289339253292],
                [13.7109375,54.059387886624],
                [7.734375,51.835777520452]
            ]
        }'
    )
)

відсутні "" "


4
Чи можете ви додати більше контексту до цієї відповіді та пояснити, як вона відповідає на питання ОП, і чим вона відрізняється від існуючих відповідей
Devdatta Tengshe

Чесно кажучи, JSON дійсно повинен бути рядком, це не рядок в цьому питанні , і це не рядок , по крайней мере , один з відповідей. Ця відповідь може вказувати на очевидне, але це не обов'язково для всіх очевидно, тому заслуговує на деяку заслугу.
Forbesmyester
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.