自动化SHP到JPG的创建


14

有谁知道将shapefile批量转换为jpeg或其他常见图像格式的方法吗?

编辑:我应该澄清一下,我想对每个shapefile应用一种样式,然后将具有该样式的shapefile导出到图像。

例如,我在一个县中有人口普查区,我想突出显示每个单独区的图像,而其他区都具有相同的颜色。


您是否有任何特定的软件?您经常使用的应用程序吗?还是您有任何可能?
RyanKDalton 2013年

我经常使用Arc和Q,并且对arcpy越来越熟悉,但实际上我只是在寻找实现此目的的任何方法,甚至是另一个第三方软件包
camdenl

2
因此,为了澄清起见,您基本上只是想生成shapefile的缩略图(或更大尺寸),没有样式,没有颜色,没有标签等,对吗?
RyanKDalton 2013年

昨晚我开始考虑这个问题,发现原来的问题可能会引起误解。我想应用一种样式,然后使用所应用的样式为每个单独的shapefile导出地图超过100次以上。
camdenl 2013年

Answers:


14

有许多免费工具,例如:

但是在Python中,参考是MapnikPython入门

  • 创建地图(以像素为单位的宽度和高度,背景颜色等)
  • 您创建样式来确定如何呈现数据
  • 您添加一个数据源(shapefile等)并从中创建一个图层。
  • 您渲染地图
  • 可以将相同的地图和样式参数应用于多个文件(通过XML文件)

请参阅Mapniks地图中的示例

来自TM_WORLD_BORDERS-0.3.shp的简单渲染图像

在此处输入图片说明

在shapefile中选择一个国家(安哥拉):

在此处输入图片说明

Mapniks Maps的另一个例子

在此处输入图片说明


4

您可以将所有图层添加到mxd,然后遍历它们并运行

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

地图中的每个图层。


只需添加此解决方案,您就可以使用arcpy.da.walk生成输入数据的初始列表:resources.arcgis.com/en/help/main/10.1/index.html
scw

3

这个类似的问题的答案使用FME将DWG转换为JPG。转换shapefile的过程与之类似。

此示例包含您可以下载的示例工作区。

FME非常适合处理批处理过程。例如,您可以将阅读器指向一个文件夹,该文件夹将包括该文件夹中的所有shapefile。

我创建了一个简单的工作流,该工作流读取文件夹中的所有shapefile并将其写到单独的JPG中。

工作流程


3

哦,我昨天在蒙大拿州的县里做了这个!回答是否为时已晚?假设您已经使用Split来为每个人口普查区域制作一个shapefile,我发现在组图层中处理它们很容易(懒惰)。假设这是文档中唯一的“图层组”,请不要打开ArcPy窗口并输入:

# 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

导出为jpg相似,但是jpg有点令人讨厌。这是我的第一次ArcPy体验,所以我敢肯定有更优雅的方法可以做到这一点。


您确实做了同样的事情吗?很高兴您找到答案,谢谢您的回应
camdenl

1

这是我使用的Python脚本。可以对其进行修改以更改多边形的颜色&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)

-1

相反,只需将shp文件加载到ArcMaps中,然后根据需要进行配置即可。然后使用Alt + Print Screen或Snipping Tool截屏。然后,您将获得一个jpg或png外观与形状文件完全相同的外观。


3
我认为这不能解决问题的关键部分,即如何使流程自动化
RyanKDalton 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.