Ingressar em um arquivo CSV para shapefile usando gdal / ogr?

11

Eu tenho um shapefile com vários atributos, por exemplo YEAR, COUNTYe AREA. Eu também tenho um arquivo CSV com mais campos que eu quero no shapefile, como POPULATION. O shapefile e o arquivo CSV têm um campo GISJOIN. Eu sei como fazer uma junção no QGIS. Mas como posso fazer uma junção permanente e gravar em um shapefile usando ogr2ogrou uma das outras ferramentas no GDAL / OGR?

Lincoln Mullen
fonte
Sua compilação GDAL / OGR tem suporte espacial ou sqlite?
BradHards
@ BradHards: Não parece. É a compilação GDAL / OGR empacotada do Ubuntu 14.04.
Lincoln Mullen

Respostas:

23

O utilitário ogr2ogr suporta uma sintaxe sql limitada . Você pode associar seu CSV ao shapefile usando algo como o seguinte:

ogr2ogr -sql "select inshape.*, joincsv.* from inshape left join 'joincsv.csv'.joincsv on inshape.GISJOIN = joincsv.GISJOIN" shape_join.shp inshape.shp
user2856
fonte
8
Oh gdal / OGR - você nunca deixa de me surpreender ..
radek
@luke Isso é brilhante, mas como posso fazer isso, se meu shapefile e csv estiverem localizados em uma pasta no meu PC ... onde devo incluir meu caminho para essa pasta?
@ Lucas, sim, mas definitivamente não fiz direito, ogr2ogr -sql "selecione C: \ Path \ inshape. *, C: \ Pathjoincsv. * De C: \ Path \ inshape left join 'C: \ Path \ joincsv .csv'.joincsv em C: \ Path \ inshape.GISJOIN = joincsv.GISJOIN "shape_join.shp inshape.shp
4
ogr2ogr -sql "seleciona inshape. *, joincsv. * de inshape junta esquerda 'caminho / para / joincsv.csv'.joincsv em inshape.GISJOIN = joincsv.GISJOIN" shape_join.shp caminho / para / inshape.shp
user2856
Recebo o seguinte erro: "Aviso 1: o valor 1060008100 do campo inshape.MA do recurso 86 não foi gravado com êxito. Possivelmente devido ao número muito maior em relação à largura do campo" Alguma idéia de como resolver isso?
precisa saber é o seguinte
7

A resposta aceita é realmente útil, mas eu achei que era lenta com um banco de dados grande. Eu acredito que também limita suas opções ao ingressar nos dados.

Meu método agora é colocar tudo no SQLite (usando uma combinação de csvkit e ogr2ogr):

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

Em seguida, junte tudo e crie um shapefile a partir dele:

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
Eric Brelsford
fonte
Olá Eric, estou recebendo um erro que o myjoindb.db já existe. Esse db de segunda linha deveria ter o mesmo nome que o primeiro?
GIS Danny
Ah, bom ponto, na segunda linha, você deve adicionar um -appendpara dar ogr2ogrpermissão para abrir um banco de dados SQLite existente e adicionar a ele. Eu editei a resposta para mostrar isso.
precisa saber é o seguinte
Obrigado! Trabalhando muito bem. Mais uma pergunta, espero que rápida. A primeira linha, eu tenho um geóide de campo que continua sendo estranhamente convertido em flutuadores negativos. É um ID do censo que eu quero tratar como string, tentei envolvê-la com aspas e isso não funcionou. Existe um comando como: csvsql --db sqlite:///myjoindb.db --insert myjoincsv.csv geoid.map(str)ou algo assim?
GIS Danny
O estranho é que a junção ocorre corretamente no geóide, mas a saída tem o geóide com -2147184982 em vez do que foi inserido.
GIS Danny
Parece que geoidestá sendo convertido em um número, mas o número é tão grande que transborda e se torna negativo. Verifique a documentação do csvsql , você pode tentar especificar uma tabela na qual diz explicitamente que geoidé uma sequência, caso contrário, --no-inferencepode ajudar.
precisa saber é o seguinte