Присоединить 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

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может помочь.
Эрик Брелсфорд,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.