当前位置 : 主页 > 编程语言 > python >

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

来源:互联网 收集:自由互联 发布时间:2022-06-15
python for ArcGIS 绘制上海市环线地图 ​​地理数据​​ ​​结果预览​​ ​​完整代码​​ ​​代码解读​​ ​​注意事项​​ ​​参考文献​​ 最近的研究需要把上海环线在底图里



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

  • ​​地理数据​​
  • ​​结果预览​​
  • ​​完整代码​​
  • ​​代码解读​​
  • ​​注意事项​​
  • ​​参考文献​​

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

地理数据

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

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

结果预览

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

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

完整代码

# -*- 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软件。

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

2,如果画出来的图是一条直线,很可能是你经纬度位置调换了。

3,不懂的来微信公众号“三行科创”交流群。

参考文献

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

2,​​Polyline​​

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



上一篇:python画饼图
下一篇:没有了
网友评论