Converta shapefile para CSV, incluindo atributos E geometria?

21

Eu tenho um shapefile com mais de 60 mil entradas, todas polígonos com atributos correspondentes (totais de área cultivada, nomes de proprietários de terras, IDs de imposto, etc.). O que eu preciso em última análise é de um arquivo CSV com todos esses atributos e sua geometria correspondente (no formato xyz compatível com KML, ou seja, NÃO no formato WKT).

Eu sei que posso abrir o arquivo .dbf no Excel e obter os atributos. Também sei que posso abrir o shapefile no QGIS e copiar os dados no Excel, o que me confere atributos e geometria WKT.

Existe uma maneira simples de converter o shapefile para CSV (aberto no Excel) com atributo e geometria amigável do Google Earth?

Rikk
fonte
Para atender às suas especificações, um aplicativo ou script teria que ser construído. Não acho difícil, mas também não é trivial. Se eu tivesse a tarefa de fazê-lo, provavelmente estimaria 1 semana em tempo integral para esse trabalho.
Stephen Quan
3
Obrigado, isso é útil. Isso é meio louco embora. Se o tamanho do meu arquivo não fosse tão grande, eu poderia fazê-lo automaticamente através do Google. Normalmente, faço isso importando um .shp para o Google Earth e salvando como .kml. Em seguida, carrego o .kml no Google Fusion Tables (FYI: o Google Fusion Tables tem um limite de upload de 100 mb) e exporto para .csv. Posso então brincar com o .csv como quiser - alterar atributos, adicionar novos polígonos para os quais tenho as coordenadas, etc., etc. - e reenviar o .csv recém-salvo para o Google Fusion Tables, exportar para .kml e aberto no Google Earth.
Rikk
Então, acho que a pergunta se torna ... como faço para dividir um arquivo .shp em duas partes? Isso me permitiria obter os arquivos .kml individuais abaixo do limite de 100 mb e posso usar o método mencionado acima para converter.
Rikk
1
Respondi à pergunta conforme solicitado abaixo, mas acabei de ver seu comentário. Por que você precisa de CSV? Por que não editar seus atributos, adicionar novos polígonos etc. no GIS (você disse que tinha QGIS) e depois exportá-lo para o seu KML final?
usar o seguinte comando
@Rikk - em resposta à pergunta no seu comentário: Uma maneira simples de dividir um arquivo shapefile seria fazer uma seleção espacial em parte do seu arquivo shapefile e clicar com o botão direito do mouse na camada e selecionar "Exportar". Você pode simplesmente exportar os recursos selecionados para um novo arquivo de forma menor. Isso não é científico, mas é simples. Como alternativa, você pode selecionar por alguns atributos se quiser uma abordagem mais organizada.
Radar

Respostas:

28

Aqui está um script simples que usa as ligações python OGR :

import ogr,csv,sys

shpfile=r'C:\Temp\test.shp' #sys.argv[1]
csvfile=r'C:\Temp\test.csv' #sys.argv[2]

#Open files
csvfile=open(csvfile,'wb')
ds=ogr.Open(shpfile)
lyr=ds.GetLayer()

#Get field names
dfn=lyr.GetLayerDefn()
nfields=dfn.GetFieldCount()
fields=[]
for i in range(nfields):
    fields.append(dfn.GetFieldDefn(i).GetName())
fields.append('kmlgeometry')
csvwriter = csv.DictWriter(csvfile, fields)
try:csvwriter.writeheader() #python 2.7+
except:csvfile.write(','.join(fields)+'\n')

# Write attributes and kml out to csv
for feat in lyr:
    attributes=feat.items()
    geom=feat.GetGeometryRef()
    attributes['kmlgeometry']=geom.ExportToKML()
    csvwriter.writerow(attributes)

#clean up
del csvwriter,lyr,ds
csvfile.close()

EDIT: e outro script para converter do seu CSV para KML

import ogr,csv,sys,os
ogr.UseExceptions()

csvfile=r'C:\temp\test.csv' #sys.argv[1]
kmlfile=r'C:\temp\test.kml' #sys.argv[2]

csvreader=csv.reader(open(csvfile,'rb'))
headers=csvreader.next()

ds = ogr.GetDriverByName('KML').CreateDataSource(kmlfile)
lyr = ds.CreateLayer(os.path.splitext(os.path.basename(kmlfile))[0])

for field in headers[:-1]: #skip kmlgeometry
    field_def = ogr.FieldDefn(field)
    print lyr.CreateField(field_def)

for rec in csvreader:
    feat = ogr.Feature(lyr.GetLayerDefn())
    for i,field in enumerate(headers[:-1]): #skip kmlgeometry
        feat.SetField(field, rec[i])
    feat.SetGeometry(ogr.CreateGeometryFromGML(rec[-1]))
    lyr.CreateFeature(feat)

del lyr,ds
user2856
fonte
Você pode descrever mais sobre como usar essas ligações, pois isso encobre as informações importantes que seus leitores precisariam saber.
Andrew S
8

Se você converter seu shapefile em spatialite, poderá fazer o seguinte:

1) Experimente o SQL para testar a saída:

ex.

SELECT col1, col2, col3, guia AsKml (geometry_column) FROM

2) Quando estiver satisfeito com o resultado, você pode exportá-lo para o formato CSV:

/programming/5776660/export-from-sqlite-to-csv-using-shell-script

Para mais informações sobre Spatialite:

https://www.gaia-gis.it/fossil/libspatialite/index

Funções SQL espacializadas:

http://www.gaia-gis.it/gaia-sins/spatialite-sql-3.0.0.html

Brent Edwards
fonte
3

Se você estiver trabalhando no QGIS, poderá gerar instantaneamente um documento CSV clicando com o botão direito do mouse na camada -> Salvar como -> CSV.

Se você estiver trabalhando com o ArcMap, poderá exportar o KML usando a ferramenta Camada para KML (opção Ir para busca no programa). Por algumas razões, ele gera um KMZ em vez de um KML (pelo menos foi o que aconteceu no meu caso).

Para converter um KMZ para KML:

  • Importe seu arquivo KMZ para o Google Earth e clique com o botão direito na sua camada e salve-o como KML
  • Abra o QGIS e arraste e solte o arquivo KML - ele carregará automaticamente a camada (> QGIS 2.10 PISA)
  • Clique com o botão direito do mouse no arquivo e salve-o como CSV

Este procedimento é mais longo se você estiver trabalhando com ArcGIS, mas no QGIS isso pode ser feito rapidamente. Você precisará instalar o QGIS em qualquer caso.

Menelaos Kotsollaris
fonte
Teste sua solução para QGIS e ela não funciona. Salvar como csv não preserva o componente espacial.
Philipp Schwarz
O QGIS oferece a opção de selecionar WKT durante a exportação - isso exporta a geometria (componente espacial) no formato WKT junto com o restante dos recursos no arquivo de formas.
Kozyr
De QGIS 3.0 você vai olhar para a “geometria” lista suspensa em “Opções Layer” no diálogo de exportação, e selecione AS_XY, AS_XYZouAS_WKT
leo
2

Na linha de comando, você pode usar ogr2ogr, assim:

ogr2ogr -f CSV output.csv input.shp -lco GEOMETRY=AS_XYZ

lcoé para "opções de criação de camadas", eu acho. Outras opções disponíveis estão documentadas aqui: http://www.gdal.org/drv_csv.html

leo
fonte
Leo, eu recebo "Erro 1 poderia'nt fetch camada 'GEOMETRIA = AS_XYZ' solicitado I pode trazer o arquivo em QGIS e ver claramente um vetor contendo esboços país..
Andrew S
-1

basta ir para a ferramenta de conversão no mapa de arco. então vá para a tabela para se destacar. um arquivo excel será criado. converta esse documento do excel em arquivo .csv

ruqaia shabir
fonte