Automatizza la creazione da SHP a JPG


14

Qualcuno sa come convertire in batch gli shapefile in jpeg o in un altro formato immagine comune?

modifica: avrei dovuto chiarire che vorrei applicare uno stile a ciascun file di forma, quindi esportare il file di forma con quello stile in un'immagine.

Ad esempio, ho un censimento in una contea e desidero evidenziare un'immagine di ogni singolo tratto mentre gli altri tratti sono tutti dello stesso colore.


Hai in mente qualche software in particolare? Un'applicazione che usi regolarmente? O semplicemente possibile?
RyanKDalton,

Uso Arc e Q abbastanza regolarmente e sto acquisendo maggiore familiarità con Arcpy, ma sto davvero cercando un modo per farlo, anche un altro pacchetto software di terze parti
Camdenl,

2
Quindi, per chiarimenti, in pratica stai solo cercando di generare miniature (o più grandi) del file di forma, senza stile, senza colori, senza etichette, ecc. Giusto?
RyanKDalton,

Ho iniziato a pensare a questa notte scorsa e vedo che la mia domanda originale potrebbe essere fuorviante. Vorrei applicare uno stile e quindi esportare la mappa più di 100 volte per ogni singolo file di forma con lo stile applicato.
Camdenl,

Risposte:


14

Esistono molti strumenti gratuiti come:

Ma in Python, il riferimento è Mapnik e Guida introduttiva a Python

  • Si crea una mappa (larghezza e altezza in pixel, colore di sfondo, ecc.)
  • Si creano stili che determinano la modalità di rendering dei dati
  • Aggiungete un'origine dati (shapefile, ecc.) E create un livello da esso.
  • Si rende la mappa
  • gli stessi parametri mappa e stili possono essere applicati a più file (tramite un file XML)

vedi gli esempi in Mapniks Maps

Immagini di rendering semplici da TM_WORLD_BORDERS-0.3.shp

inserisci qui la descrizione dell'immagine

selezione di un paese (Angola) nello shapefile:

inserisci qui la descrizione dell'immagine

Un altro esempio da Mapniks Maps

inserisci qui la descrizione dell'immagine


4

È possibile aggiungere tutti i layer a un mxd, quindi scorrere attraverso di essi ed eseguire

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

per ogni livello nella mappa.


Solo per aggiungere a questa soluzione, è possibile utilizzare arcpy.da.walk per generare un elenco iniziale di dati di input: resources.arcgis.com/en/help/main/10.1/index.html#//…
scw

3

Questa domanda simile ha risposte che usano FME per convertire DWG in JPG. Il processo sarà simile per la conversione di shapefile.

In questo esempio sono presenti aree di lavoro di esempio che è possibile scaricare.

FME è adatto alla gestione di processi batch. Ad esempio, è possibile puntare il lettore verso una cartella che includerà tutti gli shapefile nella cartella.

Ho creato un semplice flusso di lavoro che legge tutti gli shapefile in una cartella e li scrive in JPG separati.

flusso di lavoro


3

Oh, l'ho fatto ieri con le contee del Montana! È troppo tardi per rispondere? Supponendo che tu abbia già usato Split per creare uno shapefile per ogni tratto del censimento, ho scoperto che era facile (pigro) gestirli in un livello di gruppo. Supponendo che sia l'unico livello di gruppo nel documento, non essere timido nell'aprire la finestra di ArcPy e inserire:

# 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

L'esportazione in jpg è simile, ma i jpg sono un po 'schifosi. Questa è stata la mia prima esperienza con ArcPy, quindi sono sicuro che ci sono modi più eleganti per farlo.


Hai fatto esattamente la stessa cosa eh? Sono contento che tu l'abbia capito, grazie per la risposta
Camdenl

1

Ecco uno script Python che uso. Può essere modificato per cambiare il colore dei poligoni, ecc:

#!/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)

-1

Invece, basta caricare il file shp in ArcMaps e configurarlo come preferisci. Quindi utilizzare Alt + Stampa schermo o lo strumento di cattura per ottenere uno screenshot. Quindi avrai un jpg o un png che assomiglia esattamente a come è stato eseguito il rendering del file di forma.


3
Non penso che affronti il ​​componente chiave della domanda che è come automatizzare il processo.
RyanKDalton,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.