Невозможно импортировать геометрию .geojson в базу данных PostGis (ноль)

Я пытаюсь импортировать геоданные и связанные с ними имена из разных регионов в один файл .geojson. Некоторые геометрии являются полигонами, другие — мультиполигонами.

Вот начало файла .geojson:

{
"type": "FeatureCollection",
"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } },
"features": [
{ "type": "Feature", 
"properties": { "shapeName": "Stuttgart", "shapeISO": "", "shapeID": "9070358B86745718691241", "shapeGroup": "DEU", "shapeType": "ADM2" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 8.768902291000074, 48.521841109000036 ], [ 8.769527448000076, 48.523685716000045 ], [ 8.771349093000026, 48.523480333000066 ], [ 8.771833428000036, 48.524333358000035 ], [ 8.777268014000072, 48.522360651000042 ], [ 8.781038882000075, 48.521310749000065 ], [ 8.784831049000047, 48.520892894000042 ], [...]

Полный файл: https://drive.google.com/file/d/12sPpPsv_aQZFeD9qImgUmgPYZ4s9kUEn/view?usp=sharing

Таблица базы данных структурирована следующим образом:

                                             Table "public.polygons_level_1"
   Column    |            Type             | Collation | Nullable |         Default
-------------+-----------------------------+-----------+----------+----------------------------
 polygon_id  | bigint                      |           | not null | nextval('polygons_level_1_polygon_id_seq'::regclass)
 region_name | character varying(150)      |           |          |
 geometry    | geometry(MultiPolygon,4326) |           |          |
 created_at  | timestamp without time zone |           |          | CURRENT_TIMESTAMP
 updated_at  | timestamp without time zone |           |          | CURRENT_TIMESTAMP
 centroid    | geometry(Point,4326)        |           |          | 

Проблема: Геометрия не импортируется. Есть записи, созданные для всех 38 объектов, однако содержимое «геометрии» всегда имеет «нулевое значение».

Моя команда:

ogr2ogr -append -f "PostgreSQL" PG:"dbname=XXX user=XXX password=XXX port=XXX" \
-nln polygons_level_1 \
-nlt PROMOTE_TO_MULTI \
-sql "SELECT shapeName AS region_name FROM level1_admin2" \
./level1_admin2.geojson

Примечание:

  • Я пробовал это как с командой sql для имен регионов, так и без нее - никакой разницы в основной проблеме.
  • Геоданные должны храниться в базе данных и передаваться в MapBox по запросу в виде полигонов. -lco GEOMETRY_NAME=геометрия не решает проблему

Моя установка:

  • Макбук Про М1 Про
  • PostgreSQL 16.4

TLDR: Решение

  • Измените SQL-запрос:

-sql "SELECT shapeName as region_name, geometry FROM level1_admin2" -dialect SQLite

  • Удалите индекс и создайте его снова в базе данных с помощью пункта USING GIST(geometry), так как размер геоданных в байтах был бы слишком большим.

По крайней мере, поделитесь полным объектом в образце данных Geo JSON, чтобы иметь минимальный воспроизводимый пример stackoverflow.com/help/minimal-reproducible-example.

Pepe N O 28.08.2024 17:38

Возможно, если вы добавите модификатор -lco GEOMETRY_NAME=geometry (опция создания слоя) в свою команду, чтобы указать имя столбца геометрии вашей таблицы (назначение). Поскольку вам нужна геометрия, это может привести к путанице.

Pepe N O 28.08.2024 17:45

Я уже пробовал использовать -lco GEOMETRY_NAME, но результат не изменился. Данные предназначены для добавления к существующей записи «геометрия», поэтому команды -lco выдают только предупреждения (об игнорировании параметров создания). Полигоны действительно большие, чтобы их можно было здесь публиковать. Вот ссылка на полный .geojson (8 МБ), если вы согласны. drive.google.com/file/d/12sPpPsv_aQZFeD9qImgUmgPYZ4s9kUEn/…

GeriX 28.08.2024 17:58
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Просто укажите имя геометрии, которое будет соответствовать столбцу геометрии вашей таблицы, поскольку в вашей таблице есть два столбца геометрии, например:

-sql "SELECT shapeName as region_name, geometry FROM level1_admin2" -dialect SQLite

добавление дополнительно диалекта sql, поскольку имя геометрии различается в разных диалектах.

Хорошо, теперь данные вроде бы подтянуты. Однако теперь я получаю эту ошибку: ` ОШИБКА 1: ОШИБКА: индексная строка требует 91160 байт, максимальный размер - 8191. ОШИБКА 1: Не удалось выполнить команду INSERT для новой функции. ОШИБКА: индексная строка требует 91160 байт, максимальный размер – 8191. Команда: INSERT INTO "polygons_level_1" ("geometry", "region_name") VALUES ('0106000020E61000[...]A06404840'::GEOMETRY, 'Stuttgart') RETURNING "polygon_id" «ОШИБКА 1: невозможно записать объект 0 из слоя SELECT. ОШИБКА 1: Преждевременное прекращение трансляции после неудачной попытки `

GeriX 29.08.2024 12:07

Вторая решенная проблема: мне пришлось удалить уже автоматически созданный индекс записи и создать его заново, используя предложение USING GIST(geometry). Только после этого команда ogr2ogr импортирует их правильно. Спасибо за помощь!

GeriX 29.08.2024 13:01

Другие вопросы по теме