python在gis中的应用主要体现在哪些方面?
简单描述一下GIS和python的结合。(主要是arcgis)
一、Python中常用的GIS包
首先是python中常用的GIS包,主要包含以下几类:
二、ArcGIS中的python
ArcGIS中的python主要是ArcPy和ArcGIS API for Python。ArcPy主要是通过python操作ArcMap或者ArcGIS Pro桌面处理工具,提供了很多用于处理和查询GIS数据的函数和类。在ArcGIS体系中既有2.x版本也有3.x版本。ArcGIS API for Python则主要用于管理及使用Web端的空间资源,用于在web端实现GIS数据可视化和分析、空间数据管理、用户管理等。
这里主要以ArcPy为主:
1. arcpy核心模块
(1)ArcPy主模块
主要用于提供基本的地理对象,操作GP工具,进行基础性地理操作,如获取属性、列出数据等。
(2)数据访问模块
arcpy.da,用于基础数据访问及编辑,提供游标功能等。
(3)制图模块
arcpy.mapping或者arcpy.mp,用于制图
(4)空间分析扩展模块
arcpy.sa,使用空间分析扩展模块中的GP工具
(5)网络分析扩展模块
arcpy.na,用于使用网络分析扩展模块中的GP工具
2.常用类
Cursor | 游标 |
Fields | 字段 |
Geometry | 点、线、面等图形类 |
Parameter | 参数设置 |
FeatureSets/RecordSets | 要素和记录 |
General | 通用类,如地图范围、投影等 |
3.常用函数
(1)Cursor
SearchCursor、InsertCursor、UpdateCursor
(2)Describe
描述数据,可以返回多个属性,如数据类型、字段、投影信息等
(3)ListXXX
遍历要素类、栅格等数据
(4)调用GP工具
调用现有的GP工具,如叠加分析,裁剪,缓冲区等,函数名不一样。
三、使用方式
1. 字段计算器
2. 地理处理栏
3. 独立脚本
.py格式,直接通过python编译器运行
4. GP工具
将python脚本打包成GeoProcessing工具
四、示例
1. SDE自动备份
1# -*- coding: utf-8 -*-
2import arcpy
3from arcpy import env
4import datetime
5import re
6env.overwriteOutput = True
9import sys
10reload(sys)
11sys.setdefaultencoding('utf-8') #解决编码问题
14def copy_feature(out_path): #拷贝要素数据集至gdb中
15 for fc in featureclasses:
16 if re.match("SDE", str(fc)):
17 print "复制要素类:{0}".format(str(fc))
18 arcpy.FeatureClassToFeatureClass_conversion(fc, out_path, str(fc).split(".")[-1])
19 else:
20 print str(fc) + "不是要素类"
22if __name__ == '__main__':
23 in_path = "F:\\192.168.1.200.sde" #sde连接文件
24 out_path = "F:\\backup\\backup.gdb" #路径
26 env.workspace = in_path
27 print "开始遍历数据库:{0}".format(arcpy.env.workspace.split("\\")[-1]) #开始遍历数据库
28 featureclasses = arcpy.ListFeatureClasses() #遍历要素类
29 copy_feature(out_path) #拷贝要素类
31 datasets = arcpy.ListDatasets("", "Feature") #要素数据集
32 for ds in datasets:
33 print "开始遍历数据集:{0}".format(str(ds))
34 desc_ds = arcpy.Describe(ds)
35 dataset_out_name = str(ds).split(".")[-1] #获取要素数据集的名称
36 sr = desc_ds.SpatialReference #获取原要素数据集的参考系
37 out_path2 = out_path + "\\" + dataset_out_name
38 print "创建要素数据集:{0}".format(dataset_out_name)
39 arcpy.CreateFeatureDataset_management(out_path, dataset_out_name, sr)
40 #创建要素数据集
41 featureclasses = arcpy.ListFeatureClasses(feature_dataset = ds) #读取要素数据集中的要素类
42 copy_feature(out_path2)
45 print "备份结束......"
2. 批量裁剪
1import sys,string,os
2import arcpy
3dir="E:/raster/clip"
4files = os.listdir(dir)
5for f in files:
6 if os.path.splitext(f)[1]==".tif":
7 Input_raster_file = dir + os.sep + f
8 maskdata = "E:/raster/clip/shp/cd.shp"
9 Raster_Format = "TIFF"
10 basename = os.path.splitext(f)[0]
11 workspace = "E:/raster/clip/results"
12 Output_raster = workspace + os.sep + basename +"_clip" + ".tif"
13 arcpy.Clip_management(Input_raster_file, None, Output_raster, maskdata, None, 'ClippingGeometry', 'MAINTAIN_EXTENT')
14 print (Output_raster)
3. 批量发布服务
1# -*- coding: utf-8 -*-
2import arcpy
3import os
5import sys
6reload(sys)
7sys.setdefaultencoding('utf-8') #解决编码问题
10#mxd文件夹路径
11wrkspc = "C:\\Users\\wbg\\Desktop\\mxd"
12#连接到GIS服务器的.ags文件
13con = "C:\\Users\\wbg\\AppData\\Roaming\\ESRI\\Desktop10.6\\ArcCatalog\\arcgis on 192.168.1.200_6443 (系统管理员).ags"
14#发布server的文件夹名称,如发布到root下为空
15folder_name = "test"
17def PublishAll(wrkspc):
18 print "检查文件夹路径……"
19 if os.path.isdir(wrkspc) == False:
20 print "输入的文件夹路径无效!"
21 return
22 print "遍历文件夹……"
23 files = os.listdir(wrkspc)
24 for f in files:
25 if f.endswith(".mxd"):
26 mxdPath = os.path.join(wrkspc, f)
27 sddraft=f.split(".")[0]
28 print "publishing: " + mxdPath
29 Createmapsddraft(sddraft, mxdPath)
30 else:
31 continue
def Createmapsddraft(sddraft,mxdPath):
36 mapDoc = arcpy.mapping.MapDocument(mxdPath)
37 out_sddraft = wrkspc + sddraft + '.sddraft'
38 sd = wrkspc + sddraft + '.sd'
39 summary = sddraft
40 #tags = 'snadiao, erdiao'
41 # create service definition draft
42 if folder_name:
43 arcpy.mapping.CreateMapSDDraft(mapDoc, out_sddraft, sddraft, 'ARCGIS_SERVER',
44 con, False, folder_name, summary, None)
45 else:
47 arcpy.mapping.CreateMapSDDraft(mapDoc, out_sddraft, sddraft, 'ARCGIS_SERVER',
48 con, False, None, summary, None)
51 analysis = arcpy.mapping.AnalyzeForSD(out_sddraft)
52 # stage and upload the service if the out_sddraft analysis did not contain errors
53 if analysis['errors'] == {}:
55 if os.path.exists(sd): os.remove(sd)
56 # Execute StageService
57 arcpy.StageService_server(out_sddraft, sd)
58 # Execute UploadServiceDefinition
59 arcpy.UploadServiceDefinition_server(sd, con)
60 else:
61 # if the sddraft analysis contained errors, display them
62 print analysis['errors']
65PublishAll(wrkspc)
66
4. ArcPy + Rest API
1# -*- coding: utf-8 -*-
2#统计服务请求信息
4import httplib, urllib, urllib2, json
5import time, uuid
6import sys, os
7import getpass
8import csv
10def main(argv = None):
11 print "统计站点服务请求信息......"
13 userName = raw_input("Enter user name:")
14 password = getpass.getpass("Enter password:")
16 serverName = raw_input("Enter server name (IP):")
17 serverPort = 6080 #10.7开始默认开启6443端口,需要设置,同时支持443和80端口
19 fromTime = 0
20 while fromTime == 0:
21 fromTime =raw_input("Start date of total requests in YYYY-MM-DD HH:MM format (e.g. 2014-05-10 14:00): ")
22 try:
23 fromTime = int(time.mktime(time.strptime(fromTime, '%Y-%m-%d %H:%M'))*1000)
24 except:
25 print ("Unable to parse input. Ensure date and time is in YYYY-MM-DD HH:MM format.")
26 fromTime = 0
28 toTime = 0
29 while toTime == 0: