10
2020
06

python调用ArcGIS批量生成缓冲区(多边形等距离放大)

任务说明:需要对地图文件进行要素转面,绘制缓冲区,最后面转线,需要处理的文件有一百多个,手工处理费时费力,写一个脚本,批量自动转换

import os
import time
import arcpy
from arcpy import env

readme = '''批量绘制三级防御圈v1.0.1'''
'''
运行环境ArcGis10.7,python版本2.7
'''


# 要素转面
def l2a(fn_in, fn_out):
    if os.path.exists(('%s.shp' % fn_out).decode('utf-8')):
        print('find:%s.shp' % fn_out)
        return

    if not fn_in.endswith('.shp'):
        fn_in += '.shp'
    arcpy.FeatureToPolygon_management(fn_in, fn_out, "", "NO_ATTRIBUTES", "")


# 绘制缓冲区 单位:千米 Kilometers
def zoom(fn_in, fn_out, i_zoom):
    if os.path.exists(('%s.shp' % fn_out).decode('utf-8')):
        print('find:%s' % fn_out)
        return
    if not fn_in.endswith('.shp'):
        fn_in += '.shp'
    # 缓冲区工具速度快,但无法合并重叠区域
    # arcpy.Buffer_analysis(fn_in, fn_out, "%s Kilometers" % i_zoom, "FULL", "ROUND", "ALL", "Distance")
    # 多环缓冲区工具速度慢,但可以合并重叠区域
    arcpy.MultipleRingBuffer_analysis(fn_in, fn_out, [i_zoom], "Kilometers", "", "ALL")


# 面转线
def a2l(fn_in, fn_out):
    if os.path.exists(('%s.shp' % fn_out).decode('utf-8')):
        print('find:%s' % fn_out)
        return
    if not fn_in.endswith('.shp'):
        fn_in += '.shp'
    arcpy.PolygonToLine_management(fn_in, fn_out, "IGNORE_NEIGHBORS")


# 按照放大距离绘制缓冲区,单位千米
def task(fn_in, i_zoom):
    print("input:%s" % fn_in)
    i_t = time.time()
    d1, f1 = os.path.split(fn_in)
    fn_area = '%s/%s' % (d1, f1.replace('.shp', '_temp'))
    l2a(fn_in, fn_area)
    print('used:%-10.3f  save:%s' % (time.time() - i_t, fn_area))

    i_t = time.time()
    fn_area_zoom = '%s/%s' % (d1, f1.replace('.shp', '_temp_%skm' % i_zoom))
    zoom(fn_area, fn_area_zoom, i_zoom)
    print('used:%-10.3f  save:%s' % (time.time() - i_t, fn_area_zoom))

    i_t = time.time()
    fn_line_zoom = '%s/%s' % (d1, f1.replace('.shp', '_%skm' % i_zoom))
    a2l(fn_area_zoom, fn_line_zoom)
    print('used:%-10.3f  save:%s' % (time.time() - i_t, fn_line_zoom))


# 遍历目录,批量处理线图.shp文件
def check_dir(dir):
    ls = os.listdir(dir.decode('utf-8'))
    for l in ls:
        # print(l)
        dir2 = '%s/%s' % (dir, l.encode('utf-8'))
        # print(dir2)
        if os.path.isdir(dir2.decode('utf-8')):
            check_dir(dir2)

        if os.path.isfile(dir2.decode('utf-8')):
            if not dir2.endswith('.shp'):
                continue
            ls_skip = ['各县线图', '各城区线图', '青海县边界线图', '青海各市边界线图']
            if dir2.endswith('线图.shp') or ('西宁四区' in dir2 and dir2.endswith('区.shp')):
                b_skip = False
                for l_skip in ls_skip:
                    if l_skip in dir2:
                        b_skip = True
                        break
                if not b_skip:
                    print(dir2)
                    fn_in = dir2
                    task(fn_in, 50)
                    task(fn_in, 100)


# 批量执行
def auto():
    dir = 'D:/arcgisfile_青海/线图'
    check_dir(dir)


# 执行单个测试任务
def test():
    dir = "D:/Program/Tem_Python/0010.WebConfig_py/0240.arcgis_shp2json/0003.src_arcgis/data"
    fn_in = '%s/玛沁县级线图.shp' % dir
    task(fn_in, 50)
    task(fn_in, 100)


if __name__ == '__main__':
    # test()
    auto()

执行效果:

TIM截图20200610093519.png

« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。