Automatize a criação de SHP para JPG

14

Alguém sabe uma maneira de converter em lote shapefiles para jpegs ou outro formato de imagem comum?

editar: eu deveria ter esclarecido que gostaria de aplicar um estilo a cada shapefile e depois exportar o shapefile com esse estilo para uma imagem.

Por exemplo, eu tenho setores censitários em um município e quero uma imagem de cada setor individual destacada enquanto os outros setores são todos da mesma cor.

Camdenl
fonte
Você tem algum software em particular? Um aplicativo que você usa regularmente? Ou você apenas de alguma maneira possível?
precisa saber é o seguinte
Eu uso Arc e Q bastante regularidade e estou ficando mais familiarizado com arcpy, mas estou realmente apenas à procura de alguma maneira de fazer isso, mesmo um outro terceiro pacote de software partido
camdenl
2
Então, para esclarecimentos, você está basicamente procurando gerar miniaturas (ou maiores) do arquivo de forma, sem estilo, sem cores, sem rótulos, etc.
precisa saber é o seguinte
Comecei a pensar sobre isso ontem à noite e vejo que minha pergunta original pode ser enganosa. Gostaria de aplicar um estilo e depois exportar o mapa mais de 100 vezes para cada arquivo de forma individual com o estilo aplicado.
precisa

Respostas:

14

Existem muitas ferramentas gratuitas como:

Mas em Python, a referência é Mapnik e Introdução ao Python

  • Você cria um mapa (largura e altura em pixels, cor de fundo, etc.)
  • Você cria estilos que determinam como os dados são renderizados
  • Você adiciona uma fonte de dados (shapefile, etc.) e cria uma camada a partir dela.
  • Você renderiza o mapa
  • os mesmos parâmetros de mapa e estilos podem ser aplicados a vários arquivos (por meio de um arquivo XML)

veja os exemplos nos mapas do Mapniks

Imagens renderizadas simples de TM_WORLD_BORDERS-0.3.shp

insira a descrição da imagem aqui

seleção de um país (Angola) no shapefile:

insira a descrição da imagem aqui

Outro exemplo do Mapniks Maps

insira a descrição da imagem aqui

gene
fonte
4

Você pode adicionar todas as camadas a um mxd, percorrê-las e executar

arcpy.mapping.ExportToJPEG(map_document, out_jpeg, {data_frame}, {df_export_width}, {df_export_height}, {resolution}, {world_file}, {color_mode}, {jpeg_quality}, {progressive})

para cada camada no mapa.

Hotpepper
fonte
Apenas para adicionar a esta solução, você pode usar o arcpy.da.walk para gerar uma lista inicial de dados de entrada: resources.arcgis.com/en/help/main/10.1/index.html#//…
scw
3

Essa pergunta semelhante tem respostas que usam o FME para converter DWG em JPG. O processo será semelhante para a conversão de shapefiles.

Este exemplo tem exemplos de áreas de trabalho que você pode baixar.

O FME é adequado para lidar com processos em lote. Por exemplo, você pode apontar o leitor para uma pasta e ela incluirá todos os arquivos de forma na pasta.

Criei um fluxo de trabalho simples que lê todos os shapefiles em uma pasta e os grava em JPGs separados.

fluxo de trabalho

Fezter
fonte
3

Ontem fiz isso com condados de Montana! É tarde demais para responder? Supondo que você já tenha usado o Split para criar um shapefile para cada setor censitário, descobri que era fácil (preguiçoso) lidar com eles em uma Camada de grupo. Supondo que essa seja a única Camada de Grupo em seu documento, não tenha vergonha de abrir a janela do ArcPy e digitar:

# Setup, defining a variable for the map document, the data frame,
# and a list of layers:
mxd = arcpy.mapping.MapDocument("Current")
df = arcpy.mapping.ListDataFrames(mxd, "Layers")[0]
layers = arcpy.mapping.ListLayers(mxd)

# To copy symbology to all subLayers in the group layer,
# using a template, any normal polygon shapefile will do:
# (datum conflict warnings are irrelevant)
for layer in layers:
  if layer.isGroupLayer:
    for subLayer in layer:
      arcpy.ApplySymbologyFromLayer_management(subLayer, "templatelayer")

# Export one map with each county/tract highlighted, toggling visibility
# of each sublayer before and after:
for layer in layers:
  if layer.isGroupLayer:
    for subLayer in layer:
      print "Exporting " + str(subLayer.name)
      subLayer.visible = True
      slfile = "C:\\YourPathHere\\Subdir\\Etc\\" + str(subLayer.name) +
".png"
      arcpy.mapping.ExportToPNG(mxd, slfile, df, df_export_width=640,
df_export_height=480, transparent_color="255, 255, 255")
      subLayer.visible = False

A exportação para jpg é semelhante, mas os jpgs são meio nojentos. Esta foi a minha primeira experiência no ArcPy, por isso tenho certeza de que existem maneiras mais elegantes de fazer isso.

Branden
fonte
Você fez exatamente a mesma coisa, eh? Que bom que você descobri-lo, obrigado pela resposta
camdenl
1

Aqui está um script Python que eu uso. Ele pode ser modificado para alterar a cor dos polígonos, etc.

#!/usr/bin/env python3
from descartes import PolygonPatch
import matplotlib.pyplot as plt 
import random
import shapefile
import sys

def get_cmap(n, name='hsv'):
  '''Returns a function that maps each index in 0, 1, ..., n-1 to a distinct 
  RGB color; the keyword argument name must be a standard mpl colormap name.'''
  return plt.cm.get_cmap(name, n)

if len(sys.argv)!=3:
  print("Syntax: {0} <Shapefile> <Output>".format(sys.argv[0]))
  sys.exit(-1)

shapefile_name = sys.argv[1]
outputfile     = sys.argv[2]

polys  = shapefile.Reader(shapefile_name)
shapes = polys.shapes()
cmap   = get_cmap(len(shapes))

#Enable to randomize colours
#random.shuffle(shapes)

fig = plt.figure()
ax  = fig.add_axes((0,0,1,1)) 

for i,poly in enumerate(shapes):
  poly  = poly.__geo_interface__
  color = cmap(i)
  ax.add_patch(PolygonPatch(poly, fc=None, ec="black", alpha=1, zorder=2))

ax.axis('scaled')
ax.set_axis_off()
plt.savefig(outputfile, bbox_inches='tight', pad_inches=0)
Richard
fonte
-1

Em vez disso, basta carregar o arquivo shp no ArcMaps e configurá-lo como quiser. Em seguida, use Alt + Print Screen ou a Snipping Tool para obter uma captura de tela. Você terá um jpg ou png que se parece exatamente com a forma como o arquivo de forma foi renderizado.

Mike
fonte
3
Eu não acho que isso lide com o componente principal da pergunta, que é como automatizar o processo.
RyanKDalton