Невозможно импортировать геометрию .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), так как размер геоданных в байтах был бы слишком большим.

🤔 А знаете ли вы, что...
PostgreSQL предоставляет множество встроенных функций для обработки данных и выполнения вычислений.


53
1

Ответ:

Решено

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

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

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