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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章