Приєднатися до CSV-файлу, щоб сформувати файл за допомогою gdal / ogr?


11

У мене є шейп з декількома атрибутами, наприклад YEAR, COUNTYі AREA. У мене також є файл CSV з більшою кількістю полів, які я хочу у формі файла, наприклад POPULATION. І файл форми, і файл CSV мають поле GISJOIN. Я знаю, як зробити приєднання до QGIS. Але як я можу зробити постійне приєднання та записати у файл формату за допомогою ogr2ogrабо одного з інших інструментів у GDAL / OGR?


Чи має ваша версія GDAL / OGR підтримка простору або sqlite?
BradHards

@BradHards: Це не схоже на це. Це пакетна збірка GDAL / OGR від Ubuntu 14.04.
Лінкольн Маллен

Відповіді:


24

Ogr2ogr утиліта підтримує обмежений синтаксис SQL . Ви можете приєднати свій CSV до файлу форм, використовуючи щось таке:

ogr2ogr -sql "select inshape.*, joincsv.* from inshape left join 'joincsv.csv'.joincsv on inshape.GISJOIN = joincsv.GISJOIN" shape_join.shp inshape.shp

8
О гдал / огр - ти ніколи не перестанеш мене дивувати ..
radek

@luke Це геніально, але як я можу це зробити, якщо мій filefile та csv знаходяться в папці мого ПК ... куди я повинен включити свій шлях до цієї папки?

@Luke у мене є, Але я точно не зробив це правильно, ogr2ogr -sql "виберіть C: \ Path \ inshape. *, C: \ Pathjoincsv. * З C: \ Path \ inshape left join 'C: \ Path \ joincsv .csv'.joincsv на C: \ Path \ inshape.GISJOIN = joincsv.GISJOIN "shape_join.shp inshape.shp

4
ogr2ogr -sql "вибрати inshape. *, joincsv. * з inshape зліва приєднатися" шлях / до / joincsv.csv'.joincsv на inshape.GISJOIN = joincsv.GISJOIN "shape_join.shp path / to / inshape.shp
user2856

Я отримую таку помилку: "Попередження 1: Значення 1060008100 поля inshape.MA функції 86 не вдало записано. Можливо, через занадто велику кількість щодо ширини поля" Будь-які ідеї, як це вирішити?
RutgerH

7

Прийнята відповідь дійсно корисна, але я виявив, що це було повільно з великою базою даних. Я вважаю, що це також обмежує ваші варіанти під час приєднання до даних.

Мій метод тепер полягає в тому, щоб перетягнути все в SQLite (використовуючи комбінацію csvkit і ogr2ogr):

csvsql --db sqlite:///myjoindb.db --insert myjoincsv.csv
ogr2ogr -append -f "SQLite" myjoindb.db myjoinshp.shp

Потім приєднайтеся до всього і створіть з нього форму форми:

ogr2ogr -f "ESRI Shapefile" -sql "SELECT csv.*, shp.* FROM myjoinshp shp INNER JOIN myjoincsv csv ON csv.joinfield = shp.joinfield" joined_output.shp myjoindb.db

Ей, Еріку, я отримую помилку, що myjoindb.db вже існує. Чи повинен цей другий рядок називатися таким же, як перший?
ГІС Данні

Ну добре, у другому рядку ви захочете додати -appendтуди, щоб дати ogr2ogrдозвіл на відкриття наявного SQLite db та додавання до нього. Я відредагував відповідь, щоб показати це.
eric brelsford

Дякую! Працює чудово. Ще одне запитання, сподіваємось, швидке. У першому рядку у мене є геоїд поля, який постійно дивно перетворюється на негативні поплавці. Це ідентифікатор перепису, який я хочу розглядати як рядок, я намагався обернути рядок цитатами, і це не спрацювало. Чи є така команда: csvsql --db sqlite:///myjoindb.db --insert myjoincsv.csv geoid.map(str)або щось?
ГІС Данні

Що дивно, що з'єднання відбувається правильно на геоїдах, але вихід має геоїд з -2147184982 замість того, що в нього ввійшло.
ГІС Данні

Здається geoid, що перетворюється на число, але число настільки велике, що воно переповнюється і стає негативним. Перевірте документацію на наявність csvsql , ви можете спробувати вказати таблицю, де ви прямо говорите, що geoidце рядок, інакше це --no-inferenceможе допомогти.
Ерік Брелсфорд
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.