地理信息系统软件工程与应用开发实验报告
生活随笔
收集整理的這篇文章主要介紹了
地理信息系统软件工程与应用开发实验报告
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
空間信息工程研究所
1 Arcpy簡介
Python因其免費、開源性和跨平臺等特點,成為ArcGIS地理處理中的腳本語言。在ArcGIS中使用腳本處理數據可以劃分為兩種基本方式:一種是將腳本添加到模型或ArcToolBox中運行;另一種是在獨立的腳本環境中執行,即在操作系統提示符下執行腳本。后者在獨立環境下執行的方式,運用更加靈活。使用以Python編寫的ArcGIS應用程序和腳本,可以訪問并使用由來自多種不同領域的GIS專業人員和程序員開發的大量Python模塊。
相較于Arcgis而言,ArcPy具有輕量級的優點。ArcPy是一個以成功的arcgis scripting模塊為基礎并繼承了arcgis scripting功能進而構建而成的站點包。目的是為以實用高效的方式通過Python執行地理數據分析、數據轉換、數據管理和地圖自動化創建基礎。該包提供了豐富純正的Python體驗,具有代碼自動完成功能(輸入關鍵字和點即可獲得該關鍵字所支持的屬性和方法的彈出列表;從中選擇一個屬性或方法即可將其插入),并針對每個函數、模塊和類提供了參考文檔。在Python中使用ArcPy的另一個主要原因是,Python是一種通用的編程語言。Python是一種支持動態輸入的解釋型語言,適用于交互式操作以及為稱為腳本的一次性程序快速制作原型,同時其具有編寫大型應用程序的強大功能。用ArcPy編寫的ArcGIS應用程序的優勢在于,可以使用由來自多個不同領域的GIS專業人員和程序員組成的眾多Python小群體開發的附加模塊。
Arcpy主要由制圖模塊、數據訪問模塊、空間分析模塊及擴展模塊和基本函數功能組成。通過Arcpy可以訪問并使用來自多個不同領域的GIS專業人員和程序員開發的大量Python模塊,用戶可以在交互式環境中快速創建腳本原型并進行測試,通過Arcpy訪問地理處理工具和其他函數、類和模塊,可以快速地創建各種簡單或大型應用程序,靈活高效地實現各類業務邏輯。在Python腳本中引用Arcpy的方式如下:
import arcpy
需要注意的是,Arcpy作為地理處理框架的一部分,旨在作為自動化處理工具,而不是自定義應用程序框架,Arcpy設計的出發點并不是用來代替Ar-cObject,因此不能通過Arcpy定義ArcGIS用戶界面的按鈕、對話框、菜單選項等功能,訪問的對象和函數也是有限制的,如不能通過Arcpy新建地圖文檔或更改地圖文檔的頁面大小和方向,這些功能必須通過ArcObject來實現。
2 Arcpy腳本編程實驗
例1:mxd文件輸出為jpg:
Arcpy制圖模塊有很多輸出地圖的函數,它們和ArcMap里File>ExportMap的功能是一樣的。ArcPy對于不同的輸出格式有不同的輸出函數。這些函數如下:
? ExportToAI
? ExportToBMP
? ExportToEMF
? ExportToEPS
? ExportToGIF
? ExportToJPEG
? ExportToPDF
? ExportToPNG
? ExportToSVG
? ExportToTIFF
這些函數都以相似的方式運行。輸出函數的必選參數是地圖文檔的名稱和路徑,以及輸出文件的名稱。
# -*- coding: UTF-8 -*-
_author_ = 'zy'
_date_ = '2019/1/13 0013 14:49'
import arcpy, os, time
path = r'C:\Users\83804\Desktop\datadeal' #文件夾路徑
res = 100
print '程序開始:' + str(time.ctime())
for afile in os.listdir(path): #遍歷文件夾里的文件if afile[-3:].lower() == 'mxd': #文件名后三位為mxdmxd = arcpy.mapping.MapDocument(os.path.join(path,afile))arcpy.mapping.ExportToJPEG(mxd, os.path.join(path,afile[:-3] + 'jpg'), resolution = res)del mxd
print '程序結束:' + str(time.ctime())
將做好的珠三角微博情緒指數mxd圖轉化為了jpg格式:例2:cad文件與shp文件的互相轉化:
這里有下載好的齒輪cad設計圖,我們想讓他轉化為shp文件:
#Name: CAD2PolygonFeatureSets
import os,json
import urllib,time
import arcpy
from arcpy import env
gdb_file = "cadtemp.gdb"
work_path = "C:/TEMP/AGS"
work_gdb_path = work_path + "/" + gdb_file
if os.path.exists(work_path):print "work_path exsits"
else :os.makedirs(work_path)
if arcpy.Exists(work_gdb_path):print "gdb path exists"
else :arcpy.CreateFileGDB_management(work_path, gdb_file)
env.workspace = work_gdb_path
env.overwriteOutput = True
input_cad_file = arcpy.GetParameterAsText(0)
output_gdb_path = work_gdb_path;
output_featureset_name = "OutputCadFeatureSet";
try:cad_data =work_path+"/"+"example"+".dwg"result = arcpy.CADToGeodatabase_conversion(cad_data,output_gdb_path,output_featureset_name,1000)
except Exception, e:raise e
fcs = []
for fds in arcpy.ListDatasets('OutputCadFeatureSet','feature') + ['']:print fdsfor fc in arcpy.ListFeatureClasses('','Polygon',fds):fcs.append(fc)print fc
arcpy.SetParameter(1,fcs);
#os.remove(cad_data)
print "cad tool excute complete"可以看到,已經轉化成功。我們再次嘗試將shp文件轉化為dwg,代碼如下。
# Name: ExportToCAD.py
# Description: Create an AutoCAD DWG
import os
import shutil
import arcpy
from arcpy import env
work_path = "C:/TEMP/AGS/EXPORT"
if os.path.exists(work_path):print "output_path exsits"
else :os.makedirs(work_path)
env.workspace = work_path
env.overwriteOutput = True
input_shape_file=arcpy.GetParameterAsText(0)
output_type = "DWG_R2010"
output_file = work_path + "/export.dwg"
try:file_name=work_path+"/"+"test.shp"arcpy.ExportCAD_conversion(file_name, output_type, output_file, "IGNORE_FILENAMES_IN_TABLES", "OVERWRITE_EXISTING_FILES", "")
except Exception,e:raise eprint arcpy.GetMessages()
arcpy.SetParameter(1,output_file)
shutil.rmtree(shape_folder)
print "export cad excute complete"
例3:使用游標進行屬性表的操作:
使用游標可以遍歷屬性表中的每一行數據。游標是一個數據庫術語,它主要用于訪問表格中的每一行記錄或者向表中插入新的記錄。在表格中,一條記錄也被稱為一行。在ArcGIS中,游標通常用于從表中或向表中按行讀取或寫入新幾何結構。游標有三種形式:搜索、插入和更新。這三種游標的功能如下:
搜索游標可用于檢索行。
插入游標可用于向表或要素類中插入行。
更新游標可用于根據位置更新和刪除行。
每種類型的游標均由arcpy.da模塊中對應的ArcPy函數(SearchCursor、InsertCursor和UpdateCursor)創建。所有這三種游標可以在表、表格視圖、要素類或要素圖層上進行操作。這三種游標都有兩個必選參數:輸入表和字段名稱列表(或組)。搜索和更新游標還有幾個可選參數。調用三個游標的語法如下:
Arcpy.da.InsertCursor (in_table, field_names)
arcpy.da.SearchCursor (in_table, field_namesr {where_clause} / {spatial_reference},{explore_to_points})
arcpy.da.UpdateCursor (in_tablez field_naxnesz {where_clause},{spatial_reference} f{explore_tojpoints})
通過游標搜索得到的記錄將會輸出到一個字段列表中,列表內字段值的順序和函數中field_name參數內字段值的順序一致
# -*- coding: UTF-8 -*-
_author_ = 'zy'
_date_ = '2019/1/13 0013 14:54'
#C:\Users\83804\Documents\ArcGIS\Default.gdb
import arcpy
from arcpy import env
env.workspace=r"C:\Users\83804\Documents\ArcGIS\Default.gdb"
print "修改之前:"
#f c = "C :/Data/study. gdb/roads11
Cur=arcpy.SearchCursor("New_Shapefile2_Intersect")
for row in Cur:aa = row.getValue("NAME")bb = str(row.getValue("Shape_Area"))print "%s,area:%s"%(aa,bb)
print "修改之后:"
Cur=arcpy.UpdateCursor("New_Shapefile2_Intersect")
for row in Cur:row.setNull("id")Cur.updateRowaa = row.getValue("NAME")bb = str(row.getValue("id"))print "%s,id:%s"%(aa,bb)
輸出結果:珠三角地區地級行政區的shp屬性表:例4:Arcpy反距離插值:
反距離加權法又稱N-P法,是非規則分布點變成規則分布點常用的網格化方法之一。該方法的基本思想是離所估算的網格點距離越近的離散點對該網格點的影響越大,越遠的離散點影響越小,甚至可以認為沒有影響。在估算某一網格點的值時,假設離網格點最近的N個點對其有影響,那么這N個點對該網格點的影響與他們之間的距離成反比。
# Import system modules
import arcpy
from arcpy import env
# Set local variables
inPointFeatures = "主要河流.shp"
zField = "JB"
outRaster = "idwout01"
cellSize = 2000.0
power = 2
searchRadius = 150000
# Check out the ArcGIS 3D Analyst extension license
arcpy.CheckOutExtension("3D")
# Execute IDW
arcpy.Idw_3d(inPointFeatures, zField, outRaster, cellSize, power, searchRadius)
例5:批量刪除gdb中的數據:
import arcpy;
from arcpy import env
env.workspace=r'C:\Users\yanrui\Documents\ArcGIS\Default.gdb'
fcs = arcpy.ListFeatureClasses()
for fc in fcs:arcpy.Delete_management(fc)
例6:len 函數:
import arcpy
arcpy.env.workspace = "c:/ Shapefiles"
fcs = arcpy.ListFeatureClasses()
fcCount = len(fcs)
print fcCount
例7:要素類:
列出工作空間中所有以字母 G 開頭的要素類
import arcpy
arcpy.env.workspace = "D:/ data.gdb"
fcs = arcpy.ListFeatureClasses("G*")
例8:柵格金字塔:
為文件夾內形式為標記圖像文件格式 (TIFF) 圖像的所有柵格創建柵格金字塔
arcpy.env.workspace= "D:/ images"
# For each raster in the list of rasters
for tiff in arcpy.ListRasters("*", "TIF"):arcpy.BuildPyramids_management(tiff)
例9:插入數據:
Python插入多邊形數據
import arcpy
f=open(r'C:\data.txt')
cursor=arcpy.InsertCursor(r'C:\Data\polygon.shp')
array=arcpy.Array()
point=arcpy.Point()
for line in f:pt=line.split()str = pt[3].split(';')name = pt[1]for j in str:xy = j.split(',')point.X = float(xy[0]);point.Y = float(xy[1])array.add(point)row = cursor.newRow()row.shape = arrayrow.name = namearray.removeAll() cursor.insertRow(row)
3 C#+Arcengine二次開發
此實例是以ArcEngine為平臺,在Visual C#的集成開發環境下進行開發的一個簡單實例。目的是讓大家初步了解二次開發的大致過程。此實例要求達到的功能是:搭建系統的基本框架,實現地圖控件(MapControl)、工具欄控件(ToolbarControl)、圖層管理控件(TocControl)之間的交互操作,同時實現地圖加載、全屏顯示、放大、縮小、漫游等基本的GIS功能。
代碼展示:
引用arcengine組件庫:
功能實現:
實現打開shp文件的功能,添加openFileDialog1控件
private void menuAddShp_Click(object sender, EventArgs e){ IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactory();//添加文件過濾器選擇后綴.shpopenFileDialog1.Filter = "ShapeFile文件(*.shp)|*.shp";//設置文件對話框的初始路徑openFileDialog1.InitialDirectory = @"C:\Program Files (x86)\ArcGIS\DeveloperKit10.2\Samples\data\World";//示例數據文件夾openFileDialog1.Multiselect = false;DialogResult pDialogResult = openFileDialog1.ShowDialog();if (pDialogResult != DialogResult.OK)return;//獲取文件名與路徑string pPath = openFileDialog1.FileName;string pFolder = System.IO.Path.GetDirectoryName(pPath);string pFileName = System.IO.Path.GetFileName(pPath);IWorkspace PWorkspace = pWorkspaceFactory.OpenFromFile(pFolder, 0);IFeatureWorkspace pFeatureWorkspace = pWorkspaceFactory as IFeatureWorkspace;IFeatureClass pFC = pFeatureWorkspace.OpenFeatureClass(pFileName);IFeatureLayer pFLayer = new FeatureLayerClass();pFLayer.FeatureClass = pFC;pFLayer.Name = pFC.AliasName;ILayer pLayer = pFLayer as ILayer;IMap pMap = axMapControl1.Map;pMap.AddLayer(pLayer);axMapControl1.ActiveView.Refresh();/*IWorkspace pWorkspace1 = pWorkspaceFactory.OpenFromFile(@"C:\Program Files (x86)\ArcGIS\DeveloperKit10.2\Samples\data\World", 0);IFeatureWorkspace pFeatureWorkspace = pWorkspace1 as IFeatureWorkspace;IFeatureClass pFC = pFeatureWorkspace.OpenFeatureClass("world30.shp");IFeatureLayer pFLayer = new FeatureLayerClass();pFLayer.FeatureClass = pFC;pFLayer.Name = pFC.AliasName;ILayer pLayer=pFLayer as */ }
實現打開地圖文檔mxd的方法:
private void loadMapDocument(){//利用System中OpenFileDialog方法,顯示一個對話框,提示用戶打開文件System.Windows.Forms.OpenFileDialog openFileDialog;openFileDialog = new OpenFileDialog();openFileDialog.InitialDirectory = m_Path;//對話框結果不為OK不往下進行DialogResult DR=openFileDialog.ShowDialog();//設置對話框的名稱openFileDialog.Title = "打開地圖文檔";//獲取或設置當前文件名篩選器字符串,來決定打開文件的類型為*.MxdopenFileDialog.Filter = "map documents(*.mxd)|*.mxd";//判斷,如果對話框結果不為OK的話不繼續往下進行if (DR != DialogResult.OK)return;//獲取文件的路徑filePath以及文件名稱string filePath = openFileDialog.FileName;if (axMapControl1.CheckMxFile(filePath)){//定義axMapControl控制鼠標指針選項為沙漏光標axMapControl1.MousePointer = esriControlsMousePointer.esriPointerHourglass;//傳入LoadMxFlie方法的三個參數,filePath—文件路徑;0—地圖名稱或索引;Type.Missing—通過反射進行調用獲取參數的默認值axMapControl1.LoadMxFile(filePath, 0, Type.Missing);//定義axMapControl控制鼠標指針為默認箭頭axMapControl1.MousePointer = esriControlsMousePointer.esriPointerDefault;axMapControl1.Extent = axMapControl1.FullExtent;}else{MessageBox.Show(filePath + "不是有效的地圖文檔");}}
添加mdb數據:
public void OpenWorkspaceFromFileAccess(string clsName, string DBPath){ //新建一個Access的工作空間工廠IWorkspaceFactory workspaceFactory = new AccessWorkspaceFactoryClass();//根據Access路徑打開一個Access工作空間工廠,獲得工作空間對象IWorkspace workspace = workspaceFactory.OpenFromFile(DBPath, 0);IFeatureWorkspace accessWorkspace = workspace as IFeatureWorkspace;//打開圖層名為clsName的數據集,獲取其要素類對象FeatureClassIFeatureClass tFeatureClass = accessWorkspace.OpenFeatureClass(clsName);//實例化一個圖層(IFeatureLayer)對象素類//該對象類用于裝載被打開的tFeatureClass,最后axMapControl控件上顯示IFeatureLayer pFtLayer =new FeatureLayerClass() ;pFtLayer.FeatureClass= tFeatureClass ;pFtLayer.Name = clsName;axMapControl1.AddLayer(pFtLayer); }
效果展示:
界面:系統添加了打開,另存為,縮放,漫游,全圖等控件。
讀取自帶world.lyr數據:加載mxd文檔,shp文件,mdb空間數據文件:二次開發的圖像繪制功能:
打開美國地圖mxd文件,漫游至加州線段繪制實現代碼:
private void 線ToolStripMenuItem_Click(object sender, EventArgs e){//設置枚舉變量的繪制幾何圖形類型oprFlag = Operation.ConstructionPolyLine;//對應上述所定義的枚舉OperationgeoCollection = new PolylineClass();ptCollection = new PolylineClass();}
private void axMapControl1_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e){ missing = Type.Missing; //若為添加折線事件if (oprFlag == Operation.ConstructionPolyLine){ axMapControl1.CurrentTool = null;//通過AddPoint方法從GetPoint函數中獲取鼠標單擊的坐標ptCollection.AddPoint(GetPoint(e.mapX, e.mapY), ref missing, ref missing);//定義幾何類型繪制折線的方法Geometry = axMapControl1.TrackLine();//通過addFeature函數的兩個參數,Highways—繪制折線的圖層;Geometry—繪制的幾何折線AddFeature("Highways", Geometry);//折線添加完成之后結束編輯狀態oprFlag = Operation.Nothing;
4 參考文獻
[1-16]
參考文獻[1] 李詩宇,鄧吉強. 基于ArcPy的地學數據自動化處理與分析方法[J]. 科技創新與生產力. 2018(03): 44-46.[2] 曹斌. 基于ArcPy的矢量數據批處理方法研究[J]. 科技創新與應用. 2017(21): 90-92.[3] 宋香平,段動賓,張橋梁. 基于Arcpy專題地圖批量制作方法[J]. 黑龍江工程學院學報. 2017, 31(02): 36-40.[4] 葉寶瑩. Python ArcPy在地質信息處理中的基本應用[J]. 地礦測繪. 2017, 33(01): 15-17.[5] 劉桂英. 一種基于Python與arcpy的批量圖形文件轉換方法[J]. 科技資訊. 2015, 13(31): 1-2.[6] 張畔濤,董壽銀. 基于arcpy的地理數據庫四參數轉換[J]. 科技視界. 2015(35): 84-98.[7] 張世富. 基于ArcPy的GIS空間分析建模原理及實現方法[J]. 安徽電子信息職業技術學院學報. 2015, 14(05): 6-8.[8] 仇逸清,宋仁波,蔡安寧,等. 基于GIS和ArcPy的地質剖面半自動繪制方法[J]. 工程勘察. 2015, 43(05): 64-68.[9] 余詠勝,彭艷麗,尹言軍,等. 基于Arcpy的影像地圖自動處理技術研究[J]. 測繪通報. 2015(03): 82-85.
[10] 孫祥龍,涂建軍,黃九松,等. 基于ArcGIS空間分析技術和農用地分等成果劃定基本農田——以重慶市秀山縣為例[J]. 西南大學學報(自然科學版). 2014, 36(08): 130-135.
[11] 李俊曉,李朝奎,殷智慧. 基于ArcGIS的克里金插值方法及其應用[J]. 測繪通報. 2013(09): 87-90.
[12] 高戀,李向新,穆寶勝. 基于ArcEngine三維地形分析和可視化[J]. 河北科技大學學報. 2012, 33(01): 61-64.
[13] 王志恒,楊國東,吳瓊,等. 基于ArcEngine的虛擬校園信息管理系統的設計與實現[J]. 地理信息世界. 2008(03): 80-84.
[14] 申勝利,李華. 基于ArcEngine的ArcGIS與AutoCAD數據轉換研究[J]. 測繪通報. 2007(02): 41-43.
[15] 許捍衛,茆德柱,何江. 基于ArcEngine的GIS三維功能開發技術研究[J]. 測繪工程. 2006(06): 50-53.
[16] 朱仕杰,南卓銅. 基于ArcEngine的GIS軟件框架建設[J]. 遙感技術與應用. 2006(04): 385-390.
總結
以上是生活随笔為你收集整理的地理信息系统软件工程与应用开发实验报告的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 黑熊过河
- 下一篇: 前端开发工程师css样式进阶指南