python在gis中的应用主要体现在哪些方面?

关注者
107
被浏览
56,006
登录后你可以
不限量看优质回答 私信答主深度交流 精彩内容一键收藏

简单描述一下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: