Преобразовать шейп-файл в CSV, включая атрибуты И геометрию?

21

У меня есть шейп-файл с 60k + записями, каждый из которых является полигоном с соответствующими атрибутами (общая площадь, имена землевладельцев, налоговые номера и т. Д.). В конечном итоге мне нужен файл CSV со всеми этими атрибутами и соответствующей геометрией (в формате xyz, совместимом с KML, то есть НЕ в формате WKT).

Я знаю, что могу открыть файл .dbf в Excel и получить атрибуты. Я также знаю, что могу открыть шейп-файл в QGIS и скопировать данные в Excel, который получает мне атрибуты и геометрию WKT.

Есть ли простой способ преобразовать шейп-файл в CSV (открываемый в Excel) с атрибутом и дружественной геометрией Google Планета Земля?

Rikk
источник
Чтобы соответствовать вашим требованиям, необходимо создать приложение или скрипт. Я не думаю, что это сложно, но я не думаю, что это тоже нетривиально. Если бы у меня была задача сделать это, я бы оценил 1 неделю на полную ставку для такой работы.
Стивен Куан
3
Спасибо, это полезно. Это отчасти безумно, хотя. Если бы мой размер файла не был таким большим, я мог бы сделать это автоматически через Google. Обычно я делаю это, импортируя файл .shp в Google Планета Земля и сохраняя его в формате .kml. Затем я загружаю .kml в Google Fusion Tables (к вашему сведению: Google Fusion Tables имеет ограничение на загрузку 100 Мб) и экспортирую в .csv. Затем я могу поиграть с .csv, как захочу, - изменить атрибуты, добавить новые полигоны, координаты которых у меня есть, и т. Д., И т. Д. - и затем я заново загружаю только что сохраненные .csv в Google Fusion Tables, экспортирую в .kml и откройте в Google Earth.
Рикк
Таким образом, я думаю, что вопрос становится ... как я могу разделить файл .shp на две части? Это позволило бы мне получить отдельные файлы .kml с ограничением в 100 МБ, и я могу использовать вышеупомянутый метод для преобразования.
Рикк
1
Я ответил на вопрос, как указано ниже, но только что увидел ваш комментарий. Зачем вообще нужен csv? Почему бы не выполнить редактирование атрибутов, добавить новые полигоны и т. Д. В ГИС (вы сказали, что у вас есть QGIS), а затем экспортировать их в свой окончательный KML?
user2856
@Rikk - в ответ на вопрос в вашем комментарии: простой способ разбить шейп-файл - сделать пространственный выбор на части шейп-файла, а затем щелкнуть правой кнопкой мыши по слою и выбрать «Экспорт». Затем вы можете просто экспортировать выбранные объекты в новый, меньший шейп-файл. Это ни в коем случае не научно, но это просто. В качестве альтернативы вы можете выбрать по некоторым атрибутам, если вы хотите более организованный подход.
Радар

Ответы:

28

Вот простой скрипт, который использует привязки 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()

РЕДАКТИРОВАТЬ: и другой скрипт для преобразования из вашего CSV в 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
источник
Можете ли вы рассказать подробнее о том, как использовать эти привязки, так как они скрывают важную информацию, которую ваши читатели должны знать.
Андрей С
8

Если вы преобразуете свой шейп-файл в пространственный, вы сможете сделать следующее:

1) Поэкспериментируйте с SQL, чтобы проверить вывод:

ех.

ВЫБЕРИТЕ вкладку col1, col2, col3, AsKml (geometry_column) FROM

2) Как только вы удовлетворены результатом, вы можете экспортировать его в формат CSV:

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

Для получения дополнительной информации о Spatialite:

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

Пространственные функции SQL:

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

Брент Эдвардс
источник
3

Если вы работаете с QGIS, вы можете мгновенно создать документ CSV, щелкнув правой кнопкой мыши на слое -> Сохранить как -> CSV.

Если вы работаете с ArcMap, вы можете экспортировать KML с помощью инструмента Слой в KML (опция Перейти к поиску в программе). По некоторым причинам он генерирует KMZ вместо KML (по крайней мере, это то, что произошло в моем случае).

Чтобы преобразовать KMZ в KML:

  • Импортируйте свой файл KMZ в Google Планета Земля и щелкните правой кнопкой мыши на своем слое и сохраните его как KML
  • Откройте QGIS и перетащите файл KML - он автоматически загрузит слой (> QGIS 2.10 PISA)
  • Щелкните правой кнопкой мыши файл и сохраните его как CSV

Эта процедура длиннее, если вы работаете с ArcGIS, но в QGIS это можно сделать в кратчайшие сроки. Вам придется установить QGIS в любом случае.

Менелаос Коцолларис
источник
Протестировал ваше решение для QGIS, и оно не работает. Сохранить как CSV не сохраняет пространственную составляющую.
Филипп Шварц
QGIS дает вам возможность выбрать WKT во время экспорта - это экспортирует геометрию (пространственный компонент) в формате WKT вместе с остальными объектами в файле формы.
Козырь
С QGIS 3.0 вы будете искать «геометрии» в раскрывающемся списке в разделе «Параметры слоя» в экспортном диалоге, и выбрать AS_XY, AS_XYZилиAS_WKT
Лев
2

В командной строке вы можете использовать ogr2ogr, как это:

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

lcoя думаю, это для «вариантов создания слоя». Другие доступные варианты описаны здесь: http://www.gdal.org/drv_csv.html

Лео
источник
Лео, я получаю «Ошибка 1 не может получить запрошенный слой« GEOMETRY = AS_XYZ ». Я могу вызвать файл в QGIS и ясно увидеть вектор, содержащий контуры страны.
Эндрю S
-1

В «Галерее моделей и скриптовых инструментов» есть инструмент, который делает то, что вы ищете. он может экспортировать в Excel или CSV.

http://resources.arcgis.com/gallery/file/geoprocessing/details?entryID=95009B25-1422-2418-7FB5-B8638ECB2FA9

gotchula
источник
1
Я посмотрел на это, он не экспортирует геометрию в любом формате, не говоря уже о KML.
user2856
-1

просто перейдите к инструменту преобразования в карте дуг. затем перейдите к столу, чтобы преуспеть. Будет создан файл Excel. преобразовать этот документ Excel в файл .csv

Рукай Шабир
источник