zoukankan      html  css  js  c++  java
  • ArcGIS使用Python脚本进行地理处理


    Python是ArcGIS内置的脚本处理函数,可进行地图分析,数据处理,制图等功能。脚本与我们熟悉的ModelBuilder或是ArcToolbox功能很类似,但是不同的地方有:

    • 低层次的处理任务只有脚本可以执行,如某些表格操作
    • 脚本可以使用更复杂的编程逻辑,如错误捕捉等
    • 脚本可以包裹其他软件,如Excel 或是 R程序
    • 脚本可以单独运行,实际上也需要安装ArcGIS
    • 脚本可以定时执行

    ArcPy的类

    ArcPy有很多类,其中比较重要的有:

    • 地图自动化 arcpy.mapping
    • 地图代数 arcpy.sa

    ArcPy的执行

    导入ArcPy的方式

    • 整体导入:

      import arcpy
      
    • 按需导入:

      from arcpy import env
      # 推荐方式
      # 导入的模块、类、或是方法可以有别名,如
      # from arcpy import env as myEnv
      

    设置工作空间:

    每个任务的开始需要先设置工作空间

    import arcpy
    arcpy.env.workspace = "C:/Data"
    

    调用ArcPy中方法:

    调用ArcPy中方法的两种方式:

    1、 arcpy.<toolname_toolboxalias>() 如:

    import arcpy
    arcpy.env.workspace = "C:/Data"
    arcpy.Clip_analysis("streams.shp", "study.shp", "result.shp")  
    

    2、 arcpy..() 如:

    import arcpy
    arcpy.env.workspace = "C:/Data"
    arcpy.analysis.Clip("streams.shp", "study.shp", "result.shp")  
    

    ArcPy中包含所有ArcToolbox中方法,名称也与对应的工具名称对应,如

    Analysis Tools -> Extract -> clip对应的方法为:Clip_analysis

    注意调用函数时,如遇到无需填写的参数可用""或是"#" 占位

    获取ArcPy执行结果

    执行函数

    print arcpy.GetMesssages()
    

    ArcPy权限检查

    检查产品有:

    • arcview
    • arceditor
    • arcinfo
    • engine
    • enginegeodb
    • arcserver

    检查产品可用性:

    print arcpy.CheckProduct("arcinfo")
    # AlreadyInitalized
    
    # AlreadyInitalized— 许可已经设置
    # Available—许可可用
    # Unavailable—许可不可用
    # NotLicensed—许可无效
    # Failed—系统出错
    

    检查产品信息:

    print arcpy.ProductInfo()
    # ArcInfo
    

    检查扩展:

    arcpy.CheckExtension("spatial")
    # available
    

    ArcPy获取空间数据信息

    判断是否存在数据集

    import arcpy
    print = arcpy.Exists("C:/Data/streams.shp")
    

    arcpy.Exists() 中dataset是一个字符串,可是是windows可以识别的文件路劲,也可是是catalog中的路径。

    数据集可以是地理空间数据库要素类,shp文件,栅格文件,表格等

    数据集描述信息

    import arcpy
    desc = arcpy.Describe("C:/Data/streams.shp")
    print desc.shapeType
    

    获取的desc是一个描述对象,由于参数的类型不一定,所有得到的结果描述对象也是动态的。常用的属性有:

    shapeType, spatialReference , datasetType, dataType , path, catalogPath,file, baseName,

    name

    罗列数据

    罗列函数有:
    ListFields, ListIndexes, ListDatasets,ListFeatureClasses, ListFiles, ListRasters, ListTables,ListWorkspaces, and ListVersions. 含义根据命名可知。

    # 罗列要素类
    ListFeatureClasses ({wild_card}, {feature_type}, {feature_dataset})
    # 罗列栅格
    ListRasters ({wild_card}, {raster_type})
    # 罗列字段
    ListFields(dataset, {wild_card}, {field_type})
    

    上面三个函数中,参数凡有{}都可以省略,可以看到ListFeatureClasses,和ListRasters可以都省略的。在设置工作空间后,可以省略参数,罗列空间中的要素。

    ArcPy中游标,SQL

    游标

    游标用于操作表格数据,多用于操作要素属性值,游标的使用多需要结合循环语句。

    游标有三种类型:查找型SearchCursor, 插入型 InsertCursor, 修改型UpdateCursor

    游标使用方法:

    arcpy.da.InsertCursor(in_table, field_names)
    # 表格名,字段名称
    arcpy.da.SearchCursor(in_table, field_names, {where_clause}, {spatial_
    reference}, {explore_to_points})
    # 表格名称,字段名称,属性值筛选器(可选),空间索引(可选),分散为点(可选)
    arcpy.da.UpdateCursor(in_table, field_names, {where_clause}, {spatial_
    reference}, {explore_to_points})
    # 表格名称,字段名称,属性值筛选器(可选),空间索引(可选),分散为点(可选)
    

    游标详细方法如下:

    游标类型方法描述
    Search next 检索到下一行
      reset 重置到开始位置
    Insert insertRow 插入一行到表中
      next 检索到下一行
    Update deleteRow 移除表格中某一行
      next 检索到下一行
      reset 重置到开始位置
      updateRow 更新当前行
    # 插入数据
    import arcpy
    fc = "C:/Data/study.gdb/roads"
    cursor = arcpy.da.InsertCursor(fc, ["STREETNAME"])
    cursor.insertRow(["NEW STREET"])
    
    # 查找数据
    import arcpy
    fc = "C:/Data/zipcodes.shp"
    fieldname = "CITY"
    delimfield = arcpy.AddFieldDelimiters(fc, fieldname)
    cursor = arcpy.da.SearchCursor(fc, ["NAME", "CLASSCODE"], delimfield + "= 'LONGWOOD'")
    for row in cursor:
    	print row[0]
    del row
    del cursor
    
    # 修改数据
    import arcpy
    fc = "C:/Data/study.gdb/zones"
    cursor = arcpy.da.UpdateCursor(fc, ["ACRES", "SHAPE_AREA"])
    for row in cursor:
        row[0] = row[1] / 43560
        cursor.updateRow(row)
    
    # 删除数据
    import arcpy
    fc = "C:/Data/study.gdb/roads"
    cursor = arcpy.da.UpdateCursor(fc, ["STREETNAME"])
    for row in cursor:
        if row[0] == "MAIN ST":
            cursor.deleteRow()
    

    使用游标操作表格,会使表格锁定,这可防止多重操作。 若需要多次操作表格数据,则需要删除游标对象

    import arcpy
    fc = "C:/Data/study.gdb/roads"
    cursor = arcpy.da.UpdateCursor(fc, ["STREETNAME"])
    for row in cursor:
        if row[0] == "MAIN ST":
        	cursor.deleteRow()
    del row
    del cursor
    

    ArcPy操作几何要素

    读取几何信息

    点要素

    import arcpy
    fc = "C:/Data/hospitals.shp"
    cursor = arcpy.da.SearchCursor(fc, ["SHAPE@XY"])
    # SearchCursor也可以查找几何要素,第二个参数"SHAPE@XY"相当于几何要素字段,还可使用
    # SHAPE@XY 要素坐标
    # SHAPE@LENGTH 要素长度
    # SHAPE@ 全部要素对象
    for row in cursor:
        x, y = row[0]
        print("{0}, {1}".format(x,y))
    

    线要素

    import arcpy
    from arcpy import env
    env.workspace = "C:/Data"
    fc = "roads.shp"
    cursor = arcpy.da.SearchCursor(fc, ["OID@", "SHAPE@"])
    for row in cursor:
        print("Feature {0}: ".format(row[0]))
        for point in row[1].getPart(0): # getPart用于获取点对象的数组
            print("{0}, {1}".format(point.X, point.Y))
    

    写入几何信息

    将text文件写入shp

    1 542935 1619969
    2 543015 1619964
    3 543079 1619924
    4 543095 1619896
    5 543107 1619816
    6 543099 1619768
    7 543067 1619669
    8 543047 1619629
    9 543007 1619593
    
    import arcpy, fileinput, os
    from arcpy import env
    env.workspace = "C:/Data"
    infile = "C:/Data/points.txt"
    fc = "newpoly.shp"
    
    # CreateFeatureclass_management(out_path, out_name, {geometry_type})创建空要素
    arcpy.CreateFeatureclass_management("C:/Data", fc, "Polygon")
    # 新要素游标,准备插入数据
    cursor = arcpy.da.InsertCursor(fc, ["SHAPE@"])
    array = arcpy.Array()
    point = arcpy.Point()
    # 读取text文件,生成点数组
    for line in fileinput.input(infile):
    	point.ID, point.X, point.Y = line.split()
    	array.add(point) 
    # 根据array生成polygon
    polygon = arcpy.Polygon(array)
    cursor.insertRow([polygon])
    # 关闭文件输入流
    fileinput.close()
    # 关闭游标
    del cursor
    

    ArcPy操作栅格数据集

    相关概念

    • 栅格数据集(Raster Dataset),栅格空间数据模型,存储在磁盘中或是地理数据库中,有多种格式如 TIFF, JPEG, IMAGINE, Esri GRID, 和MrSID 等。可以是单波段或是多波段
    • 栅格波段(Raster Band),栅格的一个图层,代表特定波段的光谱信息
    • 栅格目录(Raster Catalog),栅格数据集的几何

    罗列栅格文件

    ListRasters({wild_card}, {raster_type})
    

    描述栅格属性

    栅格信息有:

    • bandCount,波段数目
    • compressionType,压缩类型
    • format,栅格格式
    • permanent, 是否永久
    • sensorType, 探测器类型
    import arcpy
    from arcpy import env
    env.workspace = "C:/raster"
    raster = "landcover.tif"
    desc = arcpy.Describe(raster)
    print desc.dataType
    print desc.bandCount
    print desc.compressionType
    

    单波段信息有:

    • height : 行数

    • isInteger : 是否整型

    • meanCellHeight: y方向上像元数

    • meanCellWidth : x方向上像元数

    • noDataValue :null值

    • pixelType: 像元值类型,如 8-bit integer, 16-bit integer,
      single precision floating point,

    • primaryField:索引字段

    • tableType: 表格名称

    • width :列数

    import arcpy
    from arcpy import env
    env.workspace = "C:/raster"
    rasterband = "img.tif/Band_1"
    desc = arcpy.Describe(rasterband)
    print desc.meanCellHeight
    print desc.meanCellWidth
    print desc.pixelType
    

    栅格对象初始化

    两种方式: 一是通过文件夹栅格文件,二是通过地图代数语句

    # 文件夹
    import arcpy
    myraster = arcpy.Raster("C:/raster/elevation")
    
    # 地图代数
    import arcpy
    outraster = arcpy.sa.Slope("C:/raster/elevation")
    

    栅格对象只有一个方法,save,用于保存栅格数据。

  • 相关阅读:
    关于PHPExcel直接读取Excel文件两种方法
    关于CSS
    PHP数组——自定义排序
    MYSQL常用函数
    uniapp 子组件给子组件传值
    uniapp 子组件给父组件传值
    uniapp 父亲给子组件传值
    uniapp 百度小程序 navigator跳转页面&传参
    uniapp 百度小程序预览图片
    js filter过滤,map映射 filter和map的用法
  • 原文地址:https://www.cnblogs.com/asdlijian/p/13514173.html
Copyright © 2011-2022 走看看