arcgis与python_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=gbkimportwin32com.client,arcgisscripting'''將數據值寫入到txt文件中'''defWriteDataToFile(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兩個表'''defDeleteData(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()whilerow:
name=row.getValue('水窖編號')
SJname=str(name)
DeleteData('會理水窖','水窖編號',SJname)
row=rows.next()except:printgp.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:
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与python_Arcgis-ModelBuilder和Python学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python管理系统项目首选公司_Pyt
- 下一篇: linux python3 pip3_l