Zautomatyzuj tworzenie SHP do JPG

14

Czy ktoś zna sposób na grupową konwersję plików kształtów do formatu JPEG lub innego popularnego formatu obrazu?

edycja: Powinienem był wyjaśnić, że chciałbym zastosować styl do każdego pliku kształtu, a następnie wyeksportować plik kształtu z tą stylem do obrazu.

Na przykład mam powiaty spisowe w hrabstwie i chcę wyróżnić obraz każdego z nich, podczas gdy wszystkie pozostałe są tego samego koloru.

Camdenl
źródło
Czy masz na myśli jakieś specjalne oprogramowanie? Aplikacja, z której regularnie korzystasz? A może po prostu w jakikolwiek sposób?
RyanKDalton,
Używam Arc i Q dość regularnie i zaznajomiłem się z arcpy, ale tak naprawdę szukam innego sposobu, aby to zrobić, nawet innego pakietu oprogramowania innej firmy
camdenl
2
Więc dla wyjaśnienia, po prostu chcesz wygenerować miniatury (lub większe) pliku kształtu, bez stylizacji, bez kolorów, bez etykiet itp. Prawda?
RyanKDalton,
Zacząłem myśleć o tej ostatniej nocy i widzę, że moje pierwotne pytanie może wprowadzać w błąd. Chciałbym zastosować stylizację, a następnie wyeksportować mapę ponad 100 razy dla każdego indywidualnego pliku kształtu z zastosowanym stylem.
camdenl

Odpowiedzi:

14

Istnieje wiele bezpłatnych narzędzi, takich jak:

Ale w Pythonie odniesieniem jest Mapnik i Pierwsze kroki w Pythonie

  • Tworzysz mapę (szerokość i wysokość w pikselach, kolor tła itp.)
  • Tworzysz style, które określają sposób renderowania danych
  • Dodajesz źródło danych (plik kształtu itp.) I tworzysz z niego warstwę.
  • Renderujesz mapę
  • te same parametry mapy i stylu można zastosować do wielu plików (poprzez plik XML)

zobacz przykłady w Mapniks Maps

Proste renderowane obrazy z TM_WORLD_BORDERS-0.3.shp

wprowadź opis zdjęcia tutaj

wybór kraju (Angola) w pliku kształtu:

wprowadź opis zdjęcia tutaj

Kolejny przykład z Mapniks Maps

wprowadź opis zdjęcia tutaj

gen
źródło
4

Możesz dodać wszystkie warstwy do mxd, a następnie przejść przez nie i uruchomić

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

dla każdej warstwy na mapie.

Ostra papryczka
źródło
Aby dodać do tego rozwiązania, można użyć arcpy.da.walk do wygenerowania początkowej listy danych wejściowych: resources.arcgis.com/en/help/main/10.1/index.html#//…
scw
3

To podobne pytanie zawiera odpowiedzi, które wykorzystują FME do konwersji DWG na JPG. Proces będzie podobny do konwersji plików kształtów.

Ten przykład zawiera przykładowe obszary robocze, które można pobrać.

FME dobrze nadaje się do obsługi procesów wsadowych. Na przykład możesz skierować czytnik do folderu, który obejmie wszystkie pliki kształtów w folderze.

Stworzyłem prosty przepływ pracy, który odczytuje wszystkie pliki kształtów w folderze i zapisuje je w osobnych plikach JPG.

przepływ pracy

Fezter
źródło
3

Och, zrobiłem to wczoraj z hrabstwami w Montanie! Czy jest już za późno na odpowiedź? Zakładając, że użyłeś już Splitu, aby utworzyć plik kształtu dla każdego obszaru spisu, odkryłem, że łatwo (leniwie) posługiwać się nimi w warstwie grupy. Zakładając, że jest to jedyna warstwa grupowa w twoim dokumencie, nie wstydź się otworzyć okna ArcPy i wprowadzić:

# 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

Eksport do jpg jest podobny, ale jpg są trochę szczęściarzem. To było moje pierwsze doświadczenie w ArcPy, więc jestem pewien, że istnieją bardziej eleganckie sposoby na zrobienie tego.

Branden
źródło
Zrobiłeś dokładnie to samo, co? Cieszę się, że to rozgryzłeś, dziękuję za odpowiedź
camdenl
1

Oto skrypt, którego używam. Można go zmodyfikować, aby zmienić kolor wielokątów, i c:

#!/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
źródło
-1

Zamiast tego po prostu załaduj plik shp do ArcMaps i skonfiguruj go tak, jak chcesz. Następnie użyj Alt + Print Screen lub Snipping Tool, aby uzyskać zrzut ekranu. Następnie otrzymasz plik jpg lub png, który wygląda dokładnie tak, jak renderowany był plik kształtu.

mikrofon
źródło
3
Nie sądzę, żeby dotyczyło to kluczowego elementu pytania, jakim jest automatyzacja procesu.
RyanKDalton