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

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

来源:互联网 收集:自由互联 发布时间:2022-06-15
python for ArcGIS 绘制上海市板块地图 ​​背景及思路​​ ​​完整代码​​ ​​结果截图​​ ​​代码解读​​ ​​后话​​ 背景及思路 第一次用python操作 ArcGIS, 写下这篇博文记录一



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

  • ​​背景及思路​​
  • ​​完整代码​​
  • ​​结果截图​​
  • ​​代码解读​​
  • ​​后话​​

背景及思路

第一次用python操作 ArcGIS, 写下这篇博文记录一下。板块是房地产行业专有术语,很多维度特征都在板块层级讨论的。这不,要把上海市所有所有板块画出来,作为其他数据,如产业,人口数据的一个划分,作为最小研究地理空间单位。以前咨询过淘宝,把上海市板块用ArcGIS画出来大约需要150元人民币,恰好,手里头有板块边界的位置数据,即板块边界的经纬度,如下图所示

python for ArcGIS 绘制上海市板块地图_多边形

琢磨着,自己用python写个脚本,每个板块抽象成一个由多个折点构成的多边形,实现思路大致如下

  • 读数,即读取板块边界经纬度数据
  • 拆点,即采用split()函数将经纬度数据分割,构成折点
  • 连线,即将折点连起来形成封闭多边形,即板块

完整代码

# -*- coding: utf-8 -*-
"""
Project_name:drawing plate 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 #导入数据分析模块
plate_data=pd.read_excel("lat_lng.xlsx") #读取板块数据
rows,cols=plate_data.shape #数据框尺寸
lng_lat=plate_data[u'板块经纬度'] #经纬度数据
plate_name=plate_data[u'板块名称'] #板块名称

#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): #按行循环
points=lng_lat[row].split(";") #折点
for spot in points:
xy=spot.split(",") #折点经纬度
if len(xy)==2:
point=arcpy.Point() #几何对象,用来存放折点对象
point.id=row;point.X=float(xy[0]);point.Y=float(xy[1]) #转为点对象
polygonPoints.add(point) #构成一串折点
#print(point.id)
polygon=arcpy.Polygon(polygonPoints,spatial_ref,"","") #利用折点构造多边形带空间参考
polygonGeometryList.append(polygon) #把多边形追加到数组
polygonPoints.removeAll() #移除折点
result=arcpy.CopyFeatures_management(polygonGeometryList,r"D:\python for ArcGIS\绘制上海板块\plate_of_Shanghai.shp","POLYGON")

arcpy.AddField_management(result, "title", "TEXT") #添加文本的title字段
with arcpy.da.UpdateCursor(result, ['title']) as cursor: #建立对从要素类或表返回的记录的读写访问权限。对图表层进行的title字段循环,以写入
for i, row in enumerate(cursor): #循环可迭代更新游标
row[0] = plate_name[i] #将第i行的板块名称赋值给title字段的第i行
cursor.updateRow(row) #更新表中的当前行

结果截图

图中淡黄绿色就是上海市的一个一个板块。

python for ArcGIS 绘制上海市板块地图_ArcGIS_02

代码解读

思路简单代码清晰, 所有的板块做成一个列表 polygonGeometryList ,然后一起画出来,也可以通过游标insert的办法插入。形成shape文件后再用arcpy.AddField_management增加一个字段,用for循环增加字段的值,这里是板块名称。

python for ArcGIS 绘制上海市板块地图_数据_03

后话

画出来的多边形两个相邻板块的公共分割线还存在不重合的情行,放大你会发现公共边会有空隙,以后要改进算法,消除这种拓扑错误。如果还有不懂的欢迎来微信公众号“三行科创”交流群。

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

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

3,​​python for ArcGIS 绘制北京市板块地图​​

4,​​python for ArcGIS 绘制广州市板块地图​​

5,​​python for ArcGIS 绘制深圳市板块地图​​

6,​​python for ArcGIS 绘制成都市板块地图​​

7,​​python for ArcGIS 绘制武汉市板块地图​​

8,​​python for ArcGIS 绘制杭州市板块地图​​

9,​​python for ArcGIS 绘制重庆市板块地图​​

10,​​python for ArcGIS绘制合肥市板块地图​​

11,​​python for ArcGIS 绘制南京市板块地图​​

12,​​python for ArcGIS绘制宁波市板块地图​​

13,​​python for ArcGIS 绘制沈阳市板块地图​​

14,​​python for ArcGIS 绘制苏州市板块地图​​

15,​​python for ArcGIS 绘制天津市板块地图​​

16,​​python for ArcGIS 绘制西安市板块地图​​

17,​​python for ArcGIS 绘制郑州市板块地图​​

python for ArcGIS 绘制上海市板块地图_上海市板块_04



上一篇:百度web api解析经纬度
下一篇:没有了
网友评论