Я пытаюсь импортировать геоданные и связанные с ними имена из разных регионов в один файл .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
Примечание:
Моя установка:
TLDR: Решение
-sql "SELECT shapeName as region_name, geometry FROM level1_admin2" -dialect SQLite
USING GIST(geometry)
, так как размер геоданных в байтах был бы слишком большим.Возможно, если вы добавите модификатор -lco GEOMETRY_NAME=geometry
(опция создания слоя) в свою команду, чтобы указать имя столбца геометрии вашей таблицы (назначение). Поскольку вам нужна геометрия, это может привести к путанице.
Я уже пробовал использовать -lco GEOMETRY_NAME, но результат не изменился. Данные предназначены для добавления к существующей записи «геометрия», поэтому команды -lco выдают только предупреждения (об игнорировании параметров создания). Полигоны действительно большие, чтобы их можно было здесь публиковать. Вот ссылка на полный .geojson (8 МБ), если вы согласны. drive.google.com/file/d/12sPpPsv_aQZFeD9qImgUmgPYZ4s9kUEn/…
Просто укажите имя геометрии, которое будет соответствовать столбцу геометрии вашей таблицы, поскольку в вашей таблице есть два столбца геометрии, например:
-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: Преждевременное прекращение трансляции после неудачной попытки `
Вторая решенная проблема: мне пришлось удалить уже автоматически созданный индекс записи и создать его заново, используя предложение USING GIST(geometry). Только после этого команда ogr2ogr импортирует их правильно. Спасибо за помощь!
По крайней мере, поделитесь полным объектом в образце данных Geo JSON, чтобы иметь минимальный воспроизводимый пример stackoverflow.com/help/minimal-reproducible-example.