Exemplos de scripts Python para geoprocessamento de shapefiles sem usar arcpy

33

Eu gostaria de usar um script Python que não seja baseado no arcpy para fazer coisas como consultar um arquivo shapefile por atributos, criar uma nova camada a partir da seleção e calcular áreas de um polígono e converter polígonos em pontos.

Alguém tem algum exemplo de código do uso de outros módulos ou bibliotecas Python? Eu sou capaz de fazer isso facilmente usando arcpy, mas eu queria explorar outras opções.

sherpas
fonte
geopandas é seu amigo para arquivos vetoriais. Rasterio para raster.
RutgerH

Respostas:

54

Isso é estranho, como se as pessoas de repente descobrissem o poder do Python (sem o ArcPy, que é apenas um módulo do Python entre outros), veja, por exemplo, a pergunta Visualize o shapefile no Python :

  • O processamento geoespacial no Python tem uma história muito longa, muito mais antiga que o Arcpy (ou arcgisscripting) -> não "imita" os recursos do ArcPy aqui, como Paul diz, a maioria já estava lá antes do ArcPy.
  • a referência para os módulos Python é o Python Package Index ( Pypi ) e há uma seção dedicada: Topic :: Scientific / Engineering :: GIS
  • você pode fazer qualquer coisa com esses módulos e, geralmente, é mais fácil e rápido que o ArcPy, porque é Python puro (sem cursores ...).
  • Shapely é um desses módulos para o processamento de geometrias geoespaciais -> calcular áreas de um polígono e converter polígonos em pontos.
  • se você deseja processar camadas vetoriais, existem osgeo / ogr , Fiona ou Pyshp (e outros, menos usados) -> consulta um shapefile por atributos, cria nova camada a partir da seleção, calcula áreas de um polígono, converte polígonos em pontos
  • para processar rasters, o padrão é osgeo / gdal
  • para análise espacial, existe o Pysal
  • para 3D, você pode usar outros módulos científicos, como numpy ou scipy (algoritmos 3D, grades, mas também estatísticas, geoestatística, 2D ou 3D)
  • E eu não falo sobre mapnik , matplotlib / basemap , Geodjango e ...

Você pode combinar tudo (Pysal com bem torneado, ...) e misturá-los com os outros módulos científicos.

Assim, para exemplos de scripts Python, procure Pyshp Fiona, ogr, gdal ou shapely em gis.stackexchange ou na internet (muitos exemplos, não apenas em inglês).)
Um deles em francês (os scripts e as figuras são universais!):
- Python: usando camadas de vetor e raster em uma perspectiva geológica, sem o software GIS
em inglês:
- GIS com Python, Shapely e Fiona
e em espanhol
- Determinação de áreas de polígonos irregulares usando as coordenadas dos vértices
em gis.stackexchange
- Perfil de elevação 10 km de cada lado de uma linha
- Atualizando atributos usando o Pyshp
- Como criar um arquivo de forma 3D a partir de uma varredura?
- Script Python para obter diferença de altitude entre dois pontos
- etc

O script apresentado por Aaron pode ser escrito de maneira mais simples com Fiona, que usa apenas dicionários Python:

import fiona
with fiona.open('sites.shp', 'r') as input:
    with open('hw1a.txt', 'w') as output:
       for pt in input:
           id = pt['properties']['id']
           cover = pt['properties']['cover']
           x = str(point['geometry']['coordinates'][0])
           y = str(point['geometry']['coordinates'][21])
           output.write(id + ' ' + x + ' ' + y+ ' ' + cover + '\n')

e se você usar bem torneado além disso:

from shapely.geometry import shape
with fiona.open('sites.shp', 'r') as input:
    with open('hw1a.txt', 'w') as output:
       for pt in input:
           id = pt['properties']['id']
           cover = pt['properties']['cover']
           x = str(shape(pt['geometry']).x)
           y = str(shape(pt['geometry']).y)
           output.write(id + ' ' + x + ' ' + y+ ' ' + cover + '\n')

Existem também dois livros:

Desenvolvimento Geoespacial em Python de Eric Westra.

insira a descrição da imagem aqui

Aprendendo a Análise Geoespacial com Python de Joel Lawhead

insira a descrição da imagem aqui

O Python também é usado como uma linguagem de script em outros aplicativos GIS como QGIS (Quantum GIS), GRASS GIS, gvSIG ou OpenJump ou modeladores 3D como Paraview (e Blender também!). E você pode usar a maioria dos módulos geoespaciais em todos esses aplicativos (consulte Visualizando dados do QGIS com o Blender )

17 rotações
fonte
O que é essa coisa Python de que você fala;)
Nathan W
Fiona parece estar lançando um erro de DLL no Windows.
precisa saber é o seguinte
Como você instalou o Fiona? não há problema para mim
gene
19

Eu recomendo o site USU Geoprocessing with Python usando o Open Source GIS para você começar. Eles usam principalmente a biblioteca GDAL / OGR ao longo dos exercícios. Instalar o GDAL / OGR pode ser um pouco desafiador, portanto, esta entrada do blog pode ser útil para você: Instalação do GDAL (e OGR) para Python no Windows . Verifique também as alternativas ao uso do Arcpy no GIS.SE.

O seguinte exemplo de script de geoprocessamento de código-fonte aberto (do site USU) é usado para extrair dados de atributos e gravá-los em um arquivo de texto:

# import modules
import ogr, os, sys

# set the working directory
os.chdir('f:/data/classes/python/data')

# open the output text file for writing
file = open('hw1a.txt', 'w')

# get the shapefile driver
driver = ogr.GetDriverByName('ESRI Shapefile')

# open the data source
datasource = driver.Open('sites.shp', 0)
if datasource is None:
  print 'Could not open file'
  sys.exit(1)

# get the data layer
layer = datasource.GetLayer()

# loop through the features in the layer
feature = layer.GetNextFeature()
while feature:

  # get the attributes
  id = feature.GetFieldAsString('id')
  cover = feature.GetFieldAsString('cover')

  # get the x,y coordinates for the point
  geom = feature.GetGeometryRef()
  x = str(geom.GetX())
  y = str(geom.GetY())

  # write info out to the text file
  file.write(id + ' ' + x + ' ' + y + ' ' + cover + '\n')

  # destroy the feature and get a new one
  feature.Destroy()
  feature = layer.GetNextFeature()

# close the data source and text file
datasource.Destroy()
file.close()
Aaron
fonte
4
.Destroyé um nome de método incrível: p
Jason
5

Você pode estar interessado em GDAL / OGR .

GDAL é usado para processar rasters enquanto OGR é usado para vetores. Ambas são bibliotecas de código aberto.

Se você deseja remover alguma dependência do ArcPy, pode imitar alguns recursos lendo as informações em uma matriz e executando seus próprios cálculos em Python puro.

Recentemente, fiz isso selecionando pontos em um polígono, como visto aqui . Ele utiliza o algoritmo de projeção de raios para determinar se um ponto está dentro de um polígono, dadas as coordenadas dos vértices do polígono.

Paulo
fonte
1
inclua o suficiente da essência da solução que pode ser entendida e compreendida antes de visitar e ler a página. Com o tempo, essa página provavelmente não estará nesse endereço, tornando esta resposta não muito útil. :)
Matt Wilkie
1

Eu nunca usei isso pessoalmente, mas outras pessoas no escritório gostam de usar bem torneadas: https://pypi.python.org/pypi/Shapely

Jason
fonte
Alguma chance de você poder postar alguns códigos de amostra usando o bem torneado?
Sherpas
5
As respostas apenas ao link não são úteis a longo prazo, pois inevitavelmente ficam quebradas. Inclua informações suficientes sobre o destino para que a) sua nova casa possa ser redescoberta eb) a essência da solução possa ser entendida e compreendida antes de visitar e ler a página.
Matt Wilkie