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

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)
 
这个脚本就是查找FeatureSet中的水窖数据,提取出主键字段值,并删除数据库中含有相同字段值的数据。
 
三、建立一个模型命名为“最终入库检查”,将条件1的model和条件2的python组合在一起
 
四、在Arcgis Server将这个模型发布为GP服务
      1)登录ArcGIS Server Manager,点击左侧的Add new service:
Service Name:
Type: Geocode Service
Geodata Service
Geometry Service
Globe Service
Geoprocessing Service
Image Service
Map Service
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: none
a1
Scyc3S
         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,就会出现在线数据录入界面。
 
 
 
 
 
 
 
 
 
 
 

Arcgis-ModelBuilder和Python学习的更多相关文章

  1. ​​​​​​​ARCGIS API for Python进行城市区域提取

    ​ArcGIS API for Python主要用于Web端的扩展和开发,提供简单易用.功能强大的Python库,以及大数据分析能力,可轻松实现实时数据.栅格数据.空间数据等多源数据的接入和GIS分析 ...

  2. Python学习--04条件控制与循环结构

    Python学习--04条件控制与循环结构 条件控制 在Python程序中,用if语句实现条件控制. 语法格式: if <条件判断1>: <执行1> elif <条件判断 ...

  3. Python学习--01入门

    Python学习--01入门 Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.和PHP一样,它是后端开发语言. 如果有C语言.PHP语言.JAVA语言等其中一种语言的基础,学习Py ...

  4. Python 学习小结

    python 学习小结 python 简明教程 1.python 文件 #!/etc/bin/python #coding=utf-8 2.main()函数 if __name__ == '__mai ...

  5. Python学习路径及练手项目合集

    Python学习路径及练手项目合集 https://zhuanlan.zhihu.com/p/23561159

  6. python学习笔记-python程序运行

    小白初学python,写下自己的一些想法.大神请忽略. 安装python编辑器,并配置环境(见http://www.cnblogs.com/lynn-li/p/5885001.html中 python ...

  7. Python学习记录day6

    title: Python学习记录day6 tags: python author: Chinge Yang date: 2016-12-03 --- Python学习记录day6 @(学习)[pyt ...

  8. Python学习记录day5

    title: Python学习记录day5 tags: python author: Chinge Yang date: 2016-11-26 --- 1.多层装饰器 多层装饰器的原理是,装饰器装饰函 ...

  9. [Python] 学习资料汇总

    Python是一种面向对象的解释性的计算机程序设计语言,也是一种功能强大且完善的通用型语言,已经有十多年的发展历史,成熟且稳定.Python 具有脚本语言中最丰富和强大的类库,足以支持绝大多数日常应用 ...

随机推荐

  1. 【转】C#取硬盘、CPU、主板、网卡的序号 ManagementObjectSearcher

    private void button1_Click(object sender, EventArgs e) { textBox1.Text = ""; foreach (stri ...

  2. 客户端TortoiseSVN的安装及使用方法

    一.客户端TortoiseSVN的安装 运行TortoiseSVN程序,点击Next,下面的截图顺序即为安装步骤: 图1: 图2: 图3: 图4: 点击Finish按钮后会提示重启系统,其实不重启也没 ...

  3. 注解:@Autowired

    Spring的bean对象自动装配注解,@Autowired有三种使用方式,下面分别介绍! 1. 作用于类成员变量上,即在定义类的成员变量的时候,至于其上方. public class Mobile{ ...

  4. Android之Button自定义点击效果

    我们在界面上经常会用到button按钮,但通常button点击后看不到点击的效果,如果用户连续点击了两次,就会报NAR错误,这样交互性就比较差了.如果我们自定义了button点击效果,比如我们点击了b ...

  5. [Hibernate] - Fetching strategies

    Hibernate中的抓取策略,参考文档: http://docs.jboss.org/hibernate/orm/3.5/reference/zh-CN/html/performance.html ...

  6. 剑指offer系列34----按之字形顺序打印二叉树

    [题目]请实现一个函数按照之字形打印二叉树, * 即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印, * 其他行以此类推. 未优化,不是最优解,博主用的是队列 ...

  7. SNM2无法编辑HostGroup项

    经常遇到SNM2的工具无法更新,无法编辑,或者加载急慢的情况.解决方法就是在SNM2重新添加Array,然后再重新登录试试

  8. poj1160 post office

    题目大意:有n个乡村,现在要建立m个邮局,邮局只能建在乡村里.现在要使每个乡村到离它最近的邮局距离的总和尽量小,求这个最小距离和. n<300,p<30,乡村的位置不超过10000. 分析 ...

  9. c++封装编写线程池

    在csapp学习或者其他linux底层编程的过程中,一般都会举一些多线程或多进程的例子,配合底层同步原语.系统调用api来解释怎么创建多线程/多进程. 但是这些例子和实际项目中所用到的多线程/多进程编 ...

  10. Android权限之sharedUserId和签名

    转自:http://blog.csdn.net/hmg25/article/details/6447067 最近在做个东西,巧合碰到了sharedUserId的问题,所以收集了一些资料,存存档备份. ...