zoukankan      html  css  js  c++  java
  • Arcgis-ModelBuilder和Python学习

          老师的一个项目,需求如下:

    1)arcgis版本使用9.2;

    2)需要发布一个数据入库服务,第三方调用这个服务,就可以将“水窖”点位数据存入到服务器数据库中的“水窖”图层;

    3)入库前需要检查“水窖”点位数据的合法性:

         a.水窖点位是否在合理的区域内:水窖在县城范围内;

         b.水窖编号的唯一性:水窖编号和数据库中的水窖记录编号不存在重复。

         本项目中数据入库服务是通过ArcServer进行发布,由于考虑到开发时间和开发成本,数据入库服务不采用Web Service调用AO方式。

         决定使用GP服务来实现数据入库:利用Arcgis ModelBuilder和Python脚本进行建模,模型需要实现以上的功能,然后将这个模型发布成一个GeoProsscessor服务,第三方调用这个GeoProsscessor服务就可以实现数据入库。思想如下:

          条件1:水窖点位是否在合理的区域内:水窖在县城范围内

          这个可以通过Arcgis ModelBuilder进行建模,对新添加的水窖点位数据和数据库中的县城图层进行叠加,如果水窖点落在县城范围内,就满足合理区域要求,允许存入到数据库。     

          条件2:水窖编号的唯一性:水窖编号和数据库中的水窖记录编号不存在重复

          这个需要考虑录入新的水窖数据时,水窖的编号和数据库中的编号不能存在重复。如果新录入的水窖编号和数据库中的水窖编号相同,则覆盖数据库中的相同水窖编号的水窖记录。

    一、条件1实现方式:ArcGIS建模

          在Arcmap中进行建模,在toolbox上右键New Toolbox,添加一个新的工具箱,命名为“最终数据入库”     

          在“最终数据入库”上右键,新建一个模型,命名为CheckArea,编辑这个模型,模型视图如下

     

         1)模型图的左上方,会理县界为数据库中的县界图层,FeatureSet是模型参数,为新输入的水窖点位图层,对两者进行叠加,得到“会理县界_Intersect.shp”,这个shape文件路径为in_memory会理县界_Intersect.shp,说明这个shape文件是保存在内存中的(内存中的数据文件可以更快的读写)。

         2)模型图的左下方,FeatureSet(新输入的水窖点位图层)和会理水窖(数据库中的会理水窖图层)进行Append操作,将新添加的水窖点位存入到数据库中的水窖图层中。

         3)为第二步的Append操作设置前提,前提就是“会理县界_Intersect.shp”,如果这个图层存在,说明新添加的点位都在会理县界内,这时可以允许水窖点位数据入库,也就是可以允许Append操作。如果这个图层不存在,说明新添加的点不在会理县内,不允许入库,因此Append操作不会触发,并且返回一个“会理县界_Intersect.shp”前提不为真的错误。

         4)当水窖数据入库完成后,也就是Append操作完成后,删除内存中的“会理县界_Intersect.shp”,删除操作以“会理水窖合并后”为前提,当这个图层生成完毕,也就说明数据入库完成,此时,可以删除“会理县界_Intersect.shp”图层了。

        

    二、条件2实现方式:Python脚本编写

      在“最终数据入库”上右键,Add->Script,
           General选项卡下设置:
               name:删除重复数据
               label:删除数据库中的已存在的数据
               Description:判断数据库中是否存在重复数据,如果存在删除重复数据
           Source选项卡下设置:
              Script File:D:删除重复数据.py
           Parameters选项卡下新建两个变量:
              Display Name                         Data Type
                NewPoint                               FeatureSet                       (定义Schema为数据库中的水窖图层)
               CheckData                               Boolean
      然后点击确定,编辑这个脚本:
     
    检查重复数据.py
    #coding=gbk
    import win32com.client,arcgisscripting


    '''
    将数据值写入到txt文件中
    '''
    def WriteDataToFile(value):
      file_object 
    = open('D://111.txt''w')
      Svalue
    =str(value)
      file_object.write(Svalue)
      file_object.close()
      
    print 'ok'


    '''
    DeleteData()函数用于删除Mdb图层”S_Layer“中,S_Field字段下值为S_Value的地物数据
    其中:S_Layer为图层名称
         S_Field为主键字段
         S_Value为主键字段值
    注释:一个图层的数据在mdb下,主要对应S_Layer_SHAPE_Index和S_Layer两个表
    '''
    def DeleteData(S_Layer,S_Field,S_Value):
      conn
    =win32com.client.Dispatch('ADODB.Connection')
      DSN
    ='PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=d:/sampledata/backupfinal.mdb;'
      conn.Open(DSN)
      DeleteSQL1 
    = "delete from "+S_Layer+"_SHAPE_Index where IndexedObjectId in (select OBJECTID from "+S_Layer+" where "+S_Field+" = '"+S_Value+"')"
      conn.execute(DeleteSQL1)
      DeleteSQL2 
    = "delete from "+S_Layer+" where "+S_Field+" = '"+S_Value+"'"
      conn.execute(DeleteSQL2)
      conn.close()


    '''
    查找输入参数FeatureSet中的特定字段值,并删除数据库中已存在相同字段值的地物数据
    '''
    gp 
    = arcgisscripting.create(9.3)
    try:
     NewPointSet 
    =gp.GetParameter(0)
     rows 
    = gp.SearchCursor(NewPointSet)
     row 
    = rows.Next()
     
    while row:
        name
    =row.getValue('水窖编号')
        SJname
    = str(name)
        DeleteData(
    '会理水窖','水窖编号',SJname)
        row 
    = rows.next()
    except:
        
    print gp.getmessages()
     
    CheckData=True
    gp.SetParameter(
    1,CheckData)
     
    这个脚本就是查找FeatureSet中的水窖数据,提取出主键字段值,并删除数据库中含有相同字段值的数据。
     
    三、建立一个模型命名为“最终入库检查”,将条件1的model和条件2的python组合在一起
     
    四、在Arcgis Server将这个模型发布为GP服务
          1)登录ArcGIS Server Manager,点击左侧的Add new service:
    Service Name:
    Type:
    Description:
           2)单击next,选择Toolbox的存储位置:
     A Toolbox: 
      Toolbox:  
          3)一直next,默认设置即可。
          4)然后我们就可以看见AddDataToShuiJiao的GP服务发布完成。
     
    五、在Arcgis Server中建立一个Application使用这个GP服务
            1)在Manager中新建一个application:
    Host
    Web application Name:
    Description:
    Use settings from an existing site:
             2)单击next,添加需要显示的图层。
             3)单击next,单击Add Task,选择Geoprocessing Task,确定,然后点击Supporting Service,就可以看到刚才发布的AddDataToShuiJiao服务,选择“最终入库检查” 这个模型,点击Apply,然后点击next,一路默认到底。
            4)在manager下发布这个application,勾选ToShuiJiao,然后单击Deploy。
            5)登录这个Application,我的是http://WYF:8399/ToShuiJiao,然后单击Geoprocessing Task,就会出现在线数据录入界面。
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    .NET Core微服务开发服务间调用篇-GRPC
    .NET Core微服务开发网关篇-ocelot
    刷新.NET
    (译)An introduction to Kubernetes
    一文了解Nuget的使用
    .NET Core应用框架AA介绍(二)
    .NET Core 3.0 使用Nswag生成Api文档和客户端代码
    .NET core3.0 使用Jwt保护api
    阅读源码学设计模式-单例模式
    .NET Core 3.0 部署在docker上运行
  • 原文地址:https://www.cnblogs.com/king1302217/p/2012690.html
Copyright © 2011-2022 走看看