地理信息系统软件工程与应用开发实验报告

41 篇文章 0 订阅
空间信息工程研究所
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': #文件名后三位为mxd
    mxd = 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 fds
    for 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 e
     print 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.updateRow
    aa = 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 = array
    row.name = name
    array.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();
                //添加文件过滤器选择后缀.shp
                openFileDialog1.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 = "打开地图文档";
            //获取或设置当前文件名筛选器字符串,来决定打开文件的类型为*.Mxd
            openFileDialog.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的数据集,获取其要素类对象FeatureClass
            IFeatureClass 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;//对应上述所定义的枚举Operation
            geoCollection = 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.
 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值