Преобразование xls в csv в QGIS с правильными определениями столбцов и экспорт данных в postgis

Aug 18 2020

Я использую QGIS 3.10.2 Coruna. После прочтения этого руководства (https://ieqgis.wordpress.com/2015/02/08/importing-csv-files-into-postgresql-using-the-db-manager-in-qgis/Я думал, что наконец нашел простой способ преобразования xls-данных в csv, а затем загрузки этих csv-данных в Postgis. Все действия, предпринятые ранее при загрузке данных непосредственно в pgAdmin, были очень утомительными, потому что всегда были проблемы с импортом данных с правильными определениями столбцов. При преобразовании xls в csv через qgis все столбцы конвертируются в строки, что неверно. Есть ли какие-нибудь мысли о том, как преобразовать листы Excel в CSV с правильными определениями столбцов и импортировать с этими правильными форматами в Postgis?

Ответы

1 bugmenot123 Aug 18 2020 at 21:25

Вы должны добавить файл csvt, чтобы QGIS мог читать оттуда предполагаемые типы данных.

См. QGIS 3.2 - Принуждение типа столбца при импорте csv

Подумайте об использовании не CSV, а XLS / XLSX, чтобы вы могли избежать всего этого.

1 DPSSpatial Aug 18 2020 at 23:38

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

Вместо этого я рекомендую использовать CSVKit, чтобы не только определять столбцы в таблицах, которые появятся в результате импорта CSV, но и затем использовать функции PostGIS для создания пространственных данных и т. Д.

CSVKit может читать CSV и создавать определение столбца:

csvsql -i postgresql crime.csv

Дает такой результат:

CREATE TABLE crime (
    "INCIDENT_ID" FLOAT NOT NULL,
    "OFFENSE_ID" BIGINT NOT NULL,
    "OFFENSE_CODE" VARCHAR(4) NOT NULL,
    "OFFENSE_CODE_EXTENSION" INTEGER NOT NULL,
    "OFFENSE_TYPE_ID" VARCHAR(30) NOT NULL,
    "OFFENSE_CATEGORY_ID" VARCHAR(28) NOT NULL,
    "FIRST_OCCURRENCE_DATE" TIMESTAMP WITHOUT TIME ZONE NOT NULL,
    "LAST_OCCURRENCE_DATE" TIMESTAMP WITHOUT TIME ZONE,
    "REPORTED_DATE" TIMESTAMP WITHOUT TIME ZONE NOT NULL,
    "INCIDENT_ADDRESS" VARCHAR(97),
    "GEO_X" FLOAT NOT NULL,
    "GEO_Y" FLOAT NOT NULL,
    "GEO_LON" FLOAT,
    "GEO_LAT" FLOAT,
    "DISTRICT_ID" INTEGER,
    "PRECINCT_ID" INTEGER,
    "NEIGHBORHOOD_ID" VARCHAR(26),
    "IS_CRIME" INTEGER NOT NULL,
    "IS_TRAFFIC" INTEGER NOT NULL
);

Но что еще лучше, вы выполните описанное выше и загрузите CSV с помощью одной команды:

csvsql --db postgresql://username:password@servername/databasename --table denver_crime --insert crime.csv

Вот учебник, который я создал, когда мне нужно сделать именно это:

https://github.com/dpsspatial/Installation-Instructions/blob/master/csvkit.md

Я также рекомендую использовать DBeaver вместо PGAdmin для любой из этих работ, поскольку это гораздо более удобный / разработанный аналитиком графический интерфейс для вашей базы данных, чем разработанный администратором базы данных PGAdmin (мне придется обновить снимки экрана учебника - PGAdmin 3 был Хорошо, PGAdmin 4 слишком тяжелый, и, к счастью, DBeaver пришел для нас в нужное время).