最近的研究需要把上海環線在底圖裏面加上顯示出來,用以說明各項目的大致地理位置,上海機構那邊給出一份關於上海市各環線的經緯度數據如下
地理數據
地理數據包括城市名稱,環線名稱,環線有哪些點組成,這些點的經緯度。
結果預覽
現在的任務是利用這份數據繪製出上海市環線地圖。下圖中細細的綠色線條就是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,不懂的來微信公衆號“三行科創”交流羣。