Czy konwertować plik kształtu na CSV, w tym atrybuty ORAZ geometrię?

21

Mam plik shapefile z ponad 60 000 wpisów, z których wszystkie są wielokątami z odpowiednimi atrybutami (suma areału, nazwy właścicieli ziemskich, numery NIP itp.). Ostatecznie potrzebuję pliku CSV ze wszystkimi tymi atrybutami i odpowiadającą im geometrią (w formacie xyz kompatybilnym z KML, czyli NIE w formacie WKT).

Wiem, że mogę otworzyć plik .dbf w programie Excel i uzyskać atrybuty. Wiem też, że mogę otworzyć plik kształtu w QGIS i skopiować dane do Excela, który otrzymuje atrybuty i geometrię WKT.

Czy istnieje prosty sposób przekonwertowania pliku kształtu na plik CSV (otwierany w programie Excel) za pomocą atrybutu i przyjaznej geometrii Google Earth?

Rikk
źródło
Aby spełnić Twoje wymagania, musiałbyś zbudować aplikację lub skrypt. Nie uważam, że to trudne, ale nie uważam, że jest to również trywialne. Gdybym miał to zrobić, prawdopodobnie dostałbym 1 tydzień pełnego etatu na taką pracę.
Stephen Quan
3
Dzięki, to jest pomocne. To jednak trochę szalone. Gdyby mój rozmiar pliku nie był tak duży, mógłbym to zrobić automatycznie przez Google. Zwykle robię to, importując .shp do Google Earth i zapisując jako .kml. Następnie przesyłam plik .kml do Google Fusion Tables (FYI: Google Fusion Tables ma limit wysyłania 100 MB) i eksportuję do .csv. Mogę wtedy bawić się z .csv, jak tylko chcę - zmieniać atrybuty, dodawać nowe wielokąty, dla których mam współrzędne, itp. Itd. - a następnie ponownie ładuję nowo zapisany .csv do Google Fusion Tables, eksportuję do .kml i otwórz w Google Earth.
Rikk
Więc chyba pytanie brzmi: jak podzielić plik .shp na dwie części? Pozwoliłoby mi to uzyskać poszczególne pliki .kml poniżej limitu 100 MB i mogę użyć wyżej wymienionej metody do konwersji.
Rikk
1
Odpowiedziałem na pytanie, jak zadałem poniżej, ale właśnie zobaczyłem twój komentarz. Dlaczego w ogóle potrzebujesz csv? Dlaczego nie edytujesz swoich atrybutów, dodajesz nowe wielokąty itp. W GIS (mówiłeś, że masz QGIS), a następnie eksportujesz to do końcowego KML?
user2856 24.01.12
@Rikk - w odpowiedzi na pytanie zawarte w komentarzu: Prostym sposobem na podzielenie pliku shapefile byłoby dokonanie przestrzennego zaznaczenia części pliku shapefile, a następnie kliknięcie warstwy prawym przyciskiem myszy i wybranie „Eksportuj”. Następnie możesz po prostu wyeksportować wybrane funkcje do nowego, mniejszego pliku kształtu. To wcale nie jest naukowe, ale jest proste. Alternatywnie możesz wybrać według niektórych atrybutów, jeśli chcesz bardziej zorganizowanego podejścia.
Radar

Odpowiedzi:

28

Oto prosty skrypt, który korzysta z powiązań pythonowych 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()

EDYCJA: i inny skrypt do konwersji z CSV do 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
użytkownik2856
źródło
Czy możesz opisać więcej na temat tego, jak korzystać z tych powiązań, ponieważ zawierają one ważne informacje, o których czytelnicy powinni wiedzieć.
Andrew S,
8

Po przekonwertowaniu pliku shapefile na spatialite powinieneś być w stanie wykonać następujące czynności:

1) Eksperymentuj z SQL, aby przetestować dane wyjściowe:

dawny.

Wybierz zakładkę col1, col2, col3, AsKml (geometry_column) Z zakładki

2) Gdy jesteś zadowolony z wyniku, możesz go wyeksportować do formatu CSV:

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

Aby uzyskać więcej informacji na temat Spatialite:

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

Funkcje SQL Spatialite:

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

Brent Edwards
źródło
3

Jeśli pracujesz nad QGIS, możesz natychmiast wygenerować dokument CSV, klikając prawym przyciskiem myszy warstwę -> Zapisz jako -> CSV.

Jeśli pracujesz z ArcMap, możesz wyeksportować KML za pomocą narzędzia Warstwa do KML (przejdź do opcji wyszukiwania w programie). Z niektórych powodów generuje KMZ zamiast KML (przynajmniej tak się stało w moim przypadku).

Aby przekonwertować KMZ na KML:

  • Zaimportuj plik KMZ do Google Earth i kliknij warstwę prawym przyciskiem myszy i zapisz ją jako KML
  • Otwórz QGIS i przeciągnij i upuść plik KML - automatycznie załaduje warstwę (> PG QGIS 2.10)
  • Kliknij plik prawym przyciskiem myszy i zapisz go jako CSV

Ta procedura jest dłuższa, jeśli pracujesz z ArcGIS, ale w QGIS można to zrobić w krótkim czasie. W każdym przypadku będziesz musiał zainstalować QGIS.

Menelaos Kotsollaris
źródło
Przetestowałem twoje rozwiązanie dla QGIS i nie działa. Zapisz jako csv nie zachowuje komponentu przestrzennego.
Philipp Schwarz
QGIS daje możliwość wybrania WKT podczas eksportu - eksportuje geometrię (komponent przestrzenny) w formacie WKT wraz z resztą operacji w pliku kształtu.
kozyr
Od QGIS 3.0 będzie wyglądać na „geometrii” rozwijanej listy w zakładce „opcje warstwy” w dialogu eksportu, a następnie wybierz AS_XY, AS_XYZczyAS_WKT
leo
2

W wierszu komend możesz użyć ogr2ogr:

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

lcomyślę, że dotyczy „opcji tworzenia warstw”. Inne dostępne opcje są udokumentowane tutaj: http://www.gdal.org/drv_csv.html

Lew
źródło
Leo, otrzymuję komunikat „Błąd 1 nie mógł pobrać żądanej warstwy„ GEOMETRIA = AS_XYZ ”. Mogę wywołać plik w QGIS i wyraźnie zobaczyć wektor zawierający kontury kraju.
Andrew S
-1

wystarczy przejść do narzędzia konwersji w mapie łuku. następnie przejdź do stolika, by się wyróżnić. plik Excel zostanie utworzony. przekonwertować ten dokument doc do pliku .csv

ruqaia shabir
źródło