Присоединить 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.
Линкольн Маллен

Ответы:

23

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
user2856
источник
8
О, гдал / огр - ты никогда не перестаешь меня удивлять ..
Радек
@luke Это великолепно, но как я могу это сделать, если мой shapefile и csv находятся в папке на моем ПК ... где я должен указать свой путь к этой папке?
@ У меня есть, но я определенно не сделал это правильно, 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. * из неповрежденного левого соединения 'path / to / 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 и добавить к ней. Я отредактировал ответ, чтобы показать это.
Эрик Брелсфорд
Благодаря! Работает отлично. Еще один вопрос, надеюсь, быстро. Первая строка, у меня есть полевой геоид, который странным образом преобразуется в отрицательные числа. Это идентификатор переписи, который я хочу рассматривать как строку, я пытался обернуть строку в кавычки, но это не сработало. Есть команда вроде: csvsql --db sqlite:///myjoindb.db --insert myjoincsv.csv geoid.map(str)или что-то?
ГИС Дэнни
Что странно, так это то, что соединение происходит правильно на геоиде, но на выходе есть геоид с -2147184982 вместо того, что вошло в него.
ГИС Дэнни
Похоже, что geoidон преобразуется в число, но число настолько велико, что оно переполняется и становится отрицательным. Проверьте документацию для csvsql , вы можете попробовать указать таблицу, в которой вы явно говорите, что geoidэто строка, иначе --no-inferenceможет помочь.
Эрик Брелсфорд,