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