arcgis与python_Arcgis-ModelBuilder和Python学习
老師的一個項(xiàng)目,需求如下:
1)arcgis版本使用9.2;
2)需要發(fā)布一個數(shù)據(jù)入庫服務(wù),第三方調(diào)用這個服務(wù),就可以將“水窖”點(diǎn)位數(shù)據(jù)存入到服務(wù)器數(shù)據(jù)庫中的“水窖”圖層;
3)入庫前需要檢查“水窖”點(diǎn)位數(shù)據(jù)的合法性:
a.水窖點(diǎn)位是否在合理的區(qū)域內(nèi):水窖在縣城范圍內(nèi);
b.水窖編號的唯一性:水窖編號和數(shù)據(jù)庫中的水窖記錄編號不存在重復(fù)。
本項(xiàng)目中數(shù)據(jù)入庫服務(wù)是通過ArcServer進(jìn)行發(fā)布,由于考慮到開發(fā)時(shí)間和開發(fā)成本,數(shù)據(jù)入庫服務(wù)不采用Web Service調(diào)用AO方式。
決定使用GP服務(wù)來實(shí)現(xiàn)數(shù)據(jù)入庫:利用Arcgis ModelBuilder和Python腳本進(jìn)行建模,模型需要實(shí)現(xiàn)以上的功能,然后將這個模型發(fā)布成一個GeoProsscessor服務(wù),第三方調(diào)用這個GeoProsscessor服務(wù)就可以實(shí)現(xiàn)數(shù)據(jù)入庫。思想如下:
條件1:水窖點(diǎn)位是否在合理的區(qū)域內(nèi):水窖在縣城范圍內(nèi)
這個可以通過Arcgis ModelBuilder進(jìn)行建模,對新添加的水窖點(diǎn)位數(shù)據(jù)和數(shù)據(jù)庫中的縣城圖層進(jìn)行疊加,如果水窖點(diǎn)落在縣城范圍內(nèi),就滿足合理區(qū)域要求,允許存入到數(shù)據(jù)庫。
條件2:水窖編號的唯一性:水窖編號和數(shù)據(jù)庫中的水窖記錄編號不存在重復(fù)
這個需要考慮錄入新的水窖數(shù)據(jù)時(shí),水窖的編號和數(shù)據(jù)庫中的編號不能存在重復(fù)。如果新錄入的水窖編號和數(shù)據(jù)庫中的水窖編號相同,則覆蓋數(shù)據(jù)庫中的相同水窖編號的水窖記錄。
一、條件1實(shí)現(xiàn)方式:ArcGIS建模
在Arcmap中進(jìn)行建模,在toolbox上右鍵New Toolbox,添加一個新的工具箱,命名為“最終數(shù)據(jù)入庫”
在“最終數(shù)據(jù)入庫”上右鍵,新建一個模型,命名為CheckArea,編輯這個模型,模型視圖如下
1)模型圖的左上方,會理縣界為數(shù)據(jù)庫中的縣界圖層,FeatureSet是模型參數(shù),為新輸入的水窖點(diǎn)位圖層,對兩者進(jìn)行疊加,得到“會理縣界_Intersect.shp”,這個shape文件路徑為in_memory\會理縣界_Intersect.shp,說明這個shape文件是保存在內(nèi)存中的(內(nèi)存中的數(shù)據(jù)文件可以更快的讀寫)。
2)模型圖的左下方,FeatureSet(新輸入的水窖點(diǎn)位圖層)和會理水窖(數(shù)據(jù)庫中的會理水窖圖層)進(jìn)行Append操作,將新添加的水窖點(diǎn)位存入到數(shù)據(jù)庫中的水窖圖層中。
3)為第二步的Append操作設(shè)置前提,前提就是“會理縣界_Intersect.shp”,如果這個圖層存在,說明新添加的點(diǎn)位都在會理縣界內(nèi),這時(shí)可以允許水窖點(diǎn)位數(shù)據(jù)入庫,也就是可以允許Append操作。如果這個圖層不存在,說明新添加的點(diǎn)不在會理縣內(nèi),不允許入庫,因此Append操作不會觸發(fā),并且返回一個“會理縣界_Intersect.shp”前提不為真的錯誤。
4)當(dāng)水窖數(shù)據(jù)入庫完成后,也就是Append操作完成后,刪除內(nèi)存中的“會理縣界_Intersect.shp”,刪除操作以“會理水窖合并后”為前提,當(dāng)這個圖層生成完畢,也就說明數(shù)據(jù)入庫完成,此時(shí),可以刪除“會理縣界_Intersect.shp”圖層了。
二、條件2實(shí)現(xiàn)方式:Python腳本編寫
在“最終數(shù)據(jù)入庫”上右鍵,Add->Script,
General選項(xiàng)卡下設(shè)置:
name:刪除重復(fù)數(shù)據(jù)
label:刪除數(shù)據(jù)庫中的已存在的數(shù)據(jù)
Description:判斷數(shù)據(jù)庫中是否存在重復(fù)數(shù)據(jù),如果存在刪除重復(fù)數(shù)據(jù)
Source選項(xiàng)卡下設(shè)置:
Script File:D:\刪除重復(fù)數(shù)據(jù).py
Parameters選項(xiàng)卡下新建兩個變量:
Display Name???????????????????????? Data Type
NewPoint?????????????????????????????? FeatureSet?????????????????????? (定義Schema為數(shù)據(jù)庫中的水窖圖層)
CheckData?????????????????????????????? Boolean
然后點(diǎn)擊確定,編輯這個腳本:
檢查重復(fù)數(shù)據(jù).py
#coding=gbkimportwin32com.client,arcgisscripting'''將數(shù)據(jù)值寫入到txt文件中'''defWriteDataToFile(value):
file_object=open('D://111.txt','w')
Svalue=str(value)
file_object.write(Svalue)
file_object.close()print'ok''''DeleteData()函數(shù)用于刪除Mdb圖層”S_Layer“中,S_Field字段下值為S_Value的地物數(shù)據(jù)
其中:S_Layer為圖層名稱
S_Field為主鍵字段
S_Value為主鍵字段值
注釋:一個圖層的數(shù)據(jù)在mdb下,主要對應(yīng)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()'''查找輸入?yún)?shù)FeatureSet中的特定字段值,并刪除數(shù)據(jù)庫中已存在相同字段值的地物數(shù)據(jù)'''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中的水窖數(shù)據(jù),提取出主鍵字段值,并刪除數(shù)據(jù)庫中含有相同字段值的數(shù)據(jù)。
三、建立一個模型命名為“最終入庫檢查”,將條件1的model和條件2的python組合在一起。
四、在Arcgis Server將這個模型發(fā)布為GP服務(wù)
1)登錄ArcGIS Server Manager,點(diǎn)擊左側(cè)的Add new service:
Service Name:
Type:
Geocode Service
Geodata Service
Geometry Service
Globe Service
Geoprocessing Service
Image Service
Map Service
Description:
添加新的點(diǎn)位數(shù)據(jù)到水窖圖層
2)單擊next,選擇Toolbox的存儲位置:
A Toolbox:
Toolbox:
3)一直next,默認(rèn)設(shè)置即可。
4)然后我們就可以看見AddDataToShuiJiao的GP服務(wù)發(fā)布完成。
五、在Arcgis Server中建立一個Application使用這個GP服務(wù)
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,確定,然后點(diǎn)擊Supporting Service,就可以看到剛才發(fā)布的AddDataToShuiJiao服務(wù),選擇“最終入庫檢查”?這個模型,點(diǎn)擊Apply,然后點(diǎn)擊next,一路默認(rèn)到底。
4)在manager下發(fā)布這個application,勾選ToShuiJiao,然后單擊Deploy。
5)登錄這個Application,我的是http://WYF:8399/ToShuiJiao,然后單擊Geoprocessing Task,就會出現(xiàn)在線數(shù)據(jù)錄入界面。
總結(jié)
以上是生活随笔為你收集整理的arcgis与python_Arcgis-ModelBuilder和Python学习的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python管理系统项目首选公司_Pyt
- 下一篇: linux python3 pip3_l