python for ArcGIS 绘制上海市环线地图

python for ArcGIS 绘制上海市环线地图

最近的研究需要把上海环线在底图里面加上显示出来,用以说明各项目的大致地理位置,上海机构那边给出一份关于上海市各环线的经纬度数据如下

地理数据

地理数据包括城市名称,环线名称,环线有哪些点组成,这些点的经纬度。

数据

结果预览

现在的任务是利用这份数据绘制出上海市环线地图。下图中细细的绿色线条就是python画出来的上海市环线位置,分别有内环内,内中环,中外环,郊外环一共4条环线。
结果

完整代码

# -*- coding: utf-8 -*-
"""
Project_name:drawing cirlce for shanghai
@author: 帅帅de三叔
Created on Wed Oct 30 15:16:44 2019
"""
import sys
arcpy_path = [r'D:\Python27\ArcGIS10.6\Lib\site-packages',
              r'D:\Program Files (x86)\ArcGIS\Desktop10.6\arcpy',
              r'D:\Program Files (x86)\ArcGIS\Desktop10.6\bin',
              r'D:\Program Files (x86)\ArcGIS\Desktop10.6\ArcToolbox\Scripts']
sys.path.extend(arcpy_path)
stdi,stdo,stde = sys.stdin, sys.stdout, sys.stderr 
reload(sys) #通过import引用进来时,setdefaultencoding函数在被系统调用后被删除了,所以必须reload一次
sys.stdin,sys.stdout,sys.stderr=stdi,stdo,stde 
sys.setdefaultencoding('utf-8')

import arcpy #导入地理处理模块
from arcpy import env #导入环境类
env.workspace = r"D:\python for ArcGIS\绘制上海环线"
env.overwriteOutput = True #是否开启复写
import pandas as pd #导入数据分析模块
circle_data = pd.read_excel(u"上海环线坐标.xlsx") #读环线数据
rows,cols = circle_data.shape #数据框尺寸
lng_lat = circle_data['sBoundary'] #经纬度数据
plate_name = circle_data['sName'] #板块名称

#factoryCode = arcpy.GetParameterAsText(4490) #WGS_1984_World_Mercator投影坐标系工厂代码4490,3395
#spatial_ref = arcpy.SpatialReference(factoryCode) #设置空间参考参数           
spatial_ref = arcpy.SpatialReference('China Geodetic Coordinate System 2000') #China Geodetic Coordinate System 2000 or WGS 1984 World Mercator

polygonPoints = arcpy.Array() #用来存放构成多边形的折点
polygonGeometryList = [] #用来存放多边形几何对象组

for row in range(0, rows): #按行循环
    lng = [] #用来存放各个环线的经度
    lat = [] #用来存放各个环线的纬度
    points = lng_lat[row].split("],[") #折点
    for num_index, spots in enumerate(points): #既有索引,又有实例
        if (num_index % 2) == 0: #如果是偶数
            lng.append(float(spots.replace("[", ""))) #追加经度
        else:
            lat.append(float(spots.replace("]", ""))) #追加纬度
    #print(len(lng), len(lat)) #测试每个环线由多少个点构成
    for i, j  in zip(lng, lat): #对经纬度对循环
        point = arcpy.Point() #几何对象,用来存放折点对象
        point.X = i
        point.Y = j
        point.id = row
        #print(i, j)
        polygonPoints.add(point) #构成一串折点
    polygon = arcpy.Polyline(polygonPoints, spatial_ref, "","") #利用折点构造多边形带空间参考
    polygonGeometryList.append(polygon) #把多边形追加到数组  
    polygonPoints.removeAll() #移除折点
result = arcpy.CopyFeatures_management(polygonGeometryList, r"D:\python for ArcGIS\绘制上海环线\circle_sh.shp","POLYGON") #保存

代码解读

主要包括数据处理和绘制环线两大块,关键是数据处理方面。
1,数据处理
由于原数据是一个经度在一个方括号里面,一个纬度在一个方括号里面,而生成point 的时候是要经纬度对的形式,也就是说经度,纬度成对出现,如(121.2100032,31.340544),这里先用 split(“],[”) 函数分开每个环线的经纬度,变成两串,然后再根据奇偶性判断是否追加到 lng 和 lat 列表里面去,经过这一次循环后,就把内环内,内中环,中外环和郊外环各环线的经度,纬度分别存进lng和lat列表里面去了,
2,绘制环线图像
紧接着用zip函数经度和维度打包成经纬度对,生成折点的几何对象,一串折点下连接起来便是一个线状多边形,然后利用Polyline类生成线状多边形,这样一环一环的生成也不容易混。

注意事项

1, 报reload错误

NameError: name 'reload' is not defined

利用ArcGIS自带的 python2 编译器进行编译,在VScode里面ctrl+shift+p调出python:Select Interpreter,再在其下选择ArcGIS自带的python2.7进行编译,前提是你电脑装了ArcGIS软件,arcpy这个python模块严重依赖ArcGIS软件。
编译
2,如果画出来的图是一条直线,很可能是你经纬度位置调换了。
3,不懂的来微信公众号“三行科创”交流群。

参考文献

1,python for ArcGIS 绘制上海市板块地图
2,Polyline

在这里插入图片描述

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三行数学

赞赏也是一种肯定!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值