Mapeamento temático simples de shapefile usando Python?

37

Desejo visualizar dados geográficos em Python, sem usar o ArcGIS / ArcPy, e fazer um mapa.

Na internet, descobri como fazer um mapa temático usando Python :

Aqui está um código que eu tentei:

import shpUtils
import matplotlib.pyplot as plt

shpRecords = shpUtils.loadShapefile('C:\\Users\\shapefile.shp')

for i in range(0,len(shpRecords)):
    x = []
    y = []
    for j in range(0,len(shpRecords[i]['shp_data']['parts'][0]['points'])):

    tempx = float(shpRecords[i]['shp_data']['parts'][0]['points'][j]['x'])
    tempy = float(shpRecords[i]['shp_data']['parts'][0]['points'][j]['y'])
    x.append(tempx)
    y.append(tempy)
    plt.fill(x,y)

plt.axis('equal')
plt.title("Testing")
plt.show()

No entanto, quando executo isso, isso me dá cores aleatórias.

Se eu quiser visualizar uma determinada coluna do meu shapefile, como posso implementar isso usando código semelhante?

Isso não está claro no link fornecido acima, onde ele discute apenas o uso de cores ...

Talvez eu precise de módulos extras para fazer isso, como descartes e PySAL ?

NYannickske
fonte

Respostas:

62

Não conheço o ArcPy, mas trabalho com shapefiles e raster em Python há anos

  1. Para processar shapefiles em Python, existem muitos módulos como osgeo / ogr , Fiona , Pysal ou Pyshp (o shpUtils é um deles e não o mais usado) e outros, consulte Pypi: GIS e exemplos em gis.stackexchange e muitos exemplos em a Web (não apenas em inglês). A maioria deles é muito mais antiga que o ArcPy (ou arcgisscripting) ...
  2. para processar raster você pode usar osgeo / gdal , o padrão
  3. Para processar geometrias geoespaciais, há formas bem torneadas
  4. Para plotar as geometrias, você pode usar matplotlib e possivelmente descartes , "extensão" do matplotlib para áreas, mas também muitos outros módulos, consulte Pypi: Plotagem e módulos como mayavi para representação 3D (matplotlib também)
  5. Existem também módulos como o mapnik, que oferecem diretamente as possibilidades de 1) ler um shapefile e 4) plotar com o módulo Pycairo .

Depois disso, é como um SIG:

  • você usa os módulos 1) para abrir, salvar os shapefiles e realizar os tratamentos com outros módulos, como numpy ou scipy, se desejar.
  • você pode usar formas para manipulação e análise de objetos geométricos (buffer, etc.).
  • você pode usar o matplotlib para plotar as geometrias, mas o matplotlib não sabe o que deseja plotar. É seu trabalho com os módulos 1) ou 3) especificar o que plotar (atributos, etc,) e como.

Se eu quiser visualizar uma determinada coluna do meu shapefile, como posso implementar isso no código?

Portanto, você deve aprender matplotib e os outros módulos. Você precisa aprender o ArcPy, é o mesmo ... (existem muitos tutoriais excelentes na Web, especialmente para o matplolib, e é mais fácil que o ArcPy porque é um Python puro).

Alguns exemplos apenas com Python

insira a descrição da imagem aqui

Mapa geológico (arquivo de forma de polígono) com cores com base em um atributo

insira a descrição da imagem aqui

Pontos 3D (shapefile PointZ) com cores baseadas em um atributo

insira a descrição da imagem aqui

Pontos 3D (ponto shapefile com z como atributo) e linha 3D (PolyLineZ shapefile) em um DEM e em uma varredura colocada na superfície do DEM.

insira a descrição da imagem aqui

Perfil topográfico com valores z e cores com base em atributos (formações geológicas = seção transversal) do arquivo de forma original (arquivo de forma polilinha)

insira a descrição da imagem aqui

DEM (GeoTIFF) com o módulo Mayavi2

insira a descrição da imagem aqui

DEM (ESRI ascii grid, .asc) e Point shapefiles (com z como atributo) com o módulo visvis

insira a descrição da imagem aqui

Furos (buffer 3D de uma polilinhaZ com cores baseadas em um atributo (formações geológicas), com uma superfície de grade calculada com os módulos numpy e matplotlib a partir de um shapefile de pontos (com z como atributo), visualizado com o módulo visvis

gene
fonte
16

Eu tive problemas semelhantes nos quais quero visualizar arquivos de forma rapidamente, e sempre achei o Matplotlib uma maneira bastante longa de realizar uma tarefa tão pequena. Em vez disso, desenvolvi o módulo "Python Geographic Visualizer" , ou GeoVis, para abreviar. Atualização: v0.2.0 agora está com muitas novas funcionalidades.

Com ele, visualizar os shapefiles não poderia ser mais fácil:

import geovis
geovis.ViewShapefile("C:/yourshapefile.shp")

Voila, o mapa aparece como uma imagem em uma janela do Tkinter e você também pode salvar o mapa em um arquivo de imagem. Também é possível estilizar, colorir e adicionar várias camadas a um mapa e, na versão mais recente, você também pode classificar com base em atributos e ampliar uma região específica. No mapa abaixo, a geovis carregou e coloriu categoricamente todas as províncias do GADM do mundo em cerca de 5 minutos. Você pode fazer o download do GeoVis aqui , onde também pode ler mais sobre como usá-lo.

insira a descrição da imagem aqui

O objetivo é a instalação fácil e a facilidade de uso, para que o GeoVis possa ser usado por qualquer pessoa que possua Python e não exija nenhum outro módulo, pois pode usar o Tkinter Canvas incorporado como renderizador. Mas é altamente recomendável que você tenha ou obtenha Aggdraw, PIL ou PyCairo, que também podem ser usados ​​como renderizadores e são de qualidade muito mais rápida e superior.

O backdraw é que seu shapefile precisa ser desprojetado com o sistema de coordenadas lat / long - ele ainda não lida com projeções ou transformações.

Karim Bahgat
fonte
1

Em 2019, a maneira mais simples de criar um mapa temático a partir de um arquivo shapefile em python, são as geopandas .

Um exemplo da documentação: http://geopandas.org/mapping.html

import geopandas
world = geopandas.read_file(geopandas.datasets.get_path('naturalearth_lowres'))
world['gdp_per_cap'] = world.gdp_md_est / world.pop_est
world.plot(column='gdp_per_cap')
davemfish
fonte