⑴ 程序實現
(一)實現思路
要實現土壤環境質量評價,首先要整理好評價數據,主要包括表層土壤有機污染物分析數據圖層、表層土壤地球化學全量分析數據圖層及表層土壤采樣數據圖層3個,統一格式和投影,並存放在資料庫中;用戶可根據許可權自動載入數據,並設置參數(如區塊顏色、評價指標、評價因子、模型庫等)直接進行評價,評價的結果可用報表或色塊圖輸出,關鍵在於模型庫的建立,具體按如下流程建立。
(1)「一票否決法」評價模塊
第一步,首先連接SQL Server資料庫,載入3個數據圖層,分別是表層土壤有機污染物分析數據圖層、表層土壤地球化學全量分析數據圖層及表層土壤采樣數據圖層。
第二步,遍歷表層土壤地球化學全量分析數據點,讀取pH、Cd、Hg、As、Cu、Pb、Cr、Zn、Ni欄位對應的值,先判斷該點的pH值區間范圍,根據此pH 值范圍判斷Cd、Hg、Pb、Zn、Ni元素含量是否超標,如果超標則表示該評價單元不合格,否則從表層土壤采樣數據圖層中讀取該點的4個采樣點的屬性欄位(「土地利用」)的值,如果4個采樣點的土地利用情況均為13(水澆地),則As、Cu、Cr 3個重金屬元素使用旱地的標准,再做是否超標的判斷,如果沒有超標則轉用下一步再做判斷。
第三步,根據該點的位置讀取表層土壤有機污染物分析數據圖層中相應的土壤有機污染物分析測試數據,判斷pH值區間范圍確定DDT和六六六的標准值,最後得出該點是否超標。
(2)單元素污染指數評價模塊
第一步,首先連接SQL Server資料庫,載入3個數據圖層,分別是表層土壤有機污染物分析數據圖層、表層土壤地球化學全量分析數據圖層及表層土壤采樣數據圖層。
第二步,獲取要進行評價的評價因子(如Hg)。
第三步,遍歷表層土壤地球化學全量分析數據點,分別讀取pH、Hg欄位對應的值,先判斷某點的pH值區間范圍,根據此pH值范圍判斷Hg元素的評價標准值(SHg),當然也可以區域背景平均值、平均值加2(3)倍標准差為評價標准,將該點的實測值與評價標准值(SHg)相除,即為該Hg元素的污染指數。
如果選取的是As、Cu、Cr 3個元素,則還要進一步根據表層土壤采樣數據圖層中的「土地利用」欄位值來判斷元素的評價標准值(S)。
如果選取的是DDT和六六六2個指標,則要遍歷表層土壤有機污染物分析數據點,讀取pH、DDT(或六六六)的欄位值,根據其pH值區間范圍確定DDT(或六六六)的標准值,同樣該點的實測值與評價標准值(S)相除,即為該DDT(或六六六)的污染指數。
第四步,根據單元素污染指數值分等定級土壤質量,一般(默認)採用如下標准:
單因子污染指數<1,為非污染區;
單因子污染指數介於1~2之間,為輕污染;
單因子污染指數介於2~3之間,為中度污染;
單因子污染指數大於3,為重度污染。
(3)內梅羅(Nemrow)綜合污染指數評價模塊
第一步,首先連接SQL Server資料庫,載入3個數據圖層,分別是表層土壤有機污染物分析數據圖層、表層土壤地球化學全量分析數據圖層及表層土壤采樣數據圖層。
第二步,遍歷表層土壤有機污染物分析數據點,按照上述的單元素污染指數評價模塊分別計算DDT、六六六的污染指數值。
第三步,遍歷表層土壤地球化學全量分析數據點,按照上述的單元素污染指數評價模塊分別計算Cd、Hg、As、Cu、Pb、Cr、Zn、Ni的污染指數值。同時將表層土壤有機污染物分析數據點所控制的范圍(64km2)與表層土壤地球化學全量分析數據點做布爾運算,計算DDT、六六六、Cd、Hg、As、Cu、Pb、Cr、Zn、Ni的污染指數平均值和最大值。
第四步,根據內梅羅公式,計算每個評價單元(4km2)的綜合污染指數值。
第五步,根據綜合污染指數值分等定級土壤質量,默認可參考農業部農田土壤環境質量監測技術規范(NY/T 395—2000)(表7-4)。
表7-4 農田土壤環境質量分級標准
(二)關鍵代碼
Option Explicit
Option Compare Text
Private tpjstr As String"評價類型
Private Const bzdict ="土壤環境質量標准值"'土壤環境質量標准值
Private m_curpic As PictureBox'當前的顏色框
Public m_map As MapObjects2.map'傳入的地圖控制項
Private m_lyr As MapObjects2.maplayer'評價的圖層
Public m_Is單 As Boolean'是否是單因子評價
'*************評價子過程**********************************************
Private Sub cmd評價_Click()
Dim OldPrj As Object
On Error GoTo ERR
Dim t元素err As Long
Set OldPrj=m_map.CoordinateSystem
GetDefPrj 120.5,m_map'投影到浙江預設投影
Dim Tscale As Double""載入數據單位與評價標准單位之間倍率
Dim tpolycols As Collection
Dim i As Long
Dim t元素污染 As C元素含量
Dim t元素 As String
Dim tlyr As MapObjects2.maplayer
Dim tmrd As MapObjects2.RecordSet
Dim t元素cols As Collection
Dim j As Long
Dim t評價目標 As String
If m_Is單 Then
t評價目標 ="重金屬單因子污染評價"
Else
t評價目標 ="重金屬綜合污染評價"
End If
Dim dirname As String
dirname=m_配置.GetKey配置(m_配置文件,"臨時路徑")'獲得評價輸出路徑
Set tlyr=CreateshpByName(m_map,dirname,t評價目標)'創建評價圖層
If tlyr Is Nothing Then Exit Sub
Set t元素cols=get元素cols
Set tpolycols=Get評價單元(m_map,m_lyr.name,1000)'獲得評價單元集合
Set tmrd=tlyr.Records
tmrd.AutoFlush=False"防止每次修改操作自動引發對數據文件的寫入操作
Dim t污染 As Single"污染指數
Dim tI和 As Single"污染指數的總和
Dim MaxI As Single"污染指數的最大值
Dim newshp As MapObjects2.Polygon
Dim ttdlx As String"土壤質量等級
MaxI=0
Dim tprg As New CProgress
For i=1 To tpolycols.count
tprg.Value=100*i/tpolycols.count'設置進度
Set newshp=UnProjected(m_map,m_lyr,tpolycols(i))
If m_Is單 Then'單因子評價
Tscale=getScale(cmb元素)
Set t元素污染=get單因子污染指數(tpolycols(i),cmb元素,Tscale)
If Not t元素污染 Is Nothing Then
校檢數據,並給出錯原因.
代碼略
tmrd.AddNew
tmrd.Fields("shape").Value=newshp
tmrd.Fields("元素名稱").Value=t元素污染.元素名稱
t污染=t元素污染.污染指數
ttdlx =""
If t污染<T指標(0)Then"根據指標定級定色,T指標()為單因子分級標准值
ttdlx=Labcolor(0).Tag
ElseIf t污染>=T指標(0)And t污染 < T指標(1)Then
ttdlx=Labcolor(1).Tag
ElseIf t污染>=T指標(1)And t污染 < T指標(2)Then
ttdlx=Labcolor(2).Tag
ElseIf t污染>=T指標(2)Then
ttdlx=Labcolor(3).Tag
End If
If ttdlx <>""Then
ttdlx=Mid(ttdlx,2)
End If
tmrd.Fields("土壤質量").Value=ttdlx""評價結果寫入評價圖層文件的屬性表
tmrd.Fields("污染指數").Value=t污染
tmrd.Fields("實測值").Value=t元素污染.實測值
tmrd.Fields("背景值").Value=t元素污染.背景值
tmrd.Update
End If
Else'綜合評價
MaxI=0
tI和=0
For j=1 Tot元素cols.count
Tscale=getScale(t元素cols(j))
Set t元素污染=get單因子污染指數(tpolycols(i),t元素cols(j),Tscale)
If Not t元素污染 Is Nothing Then
tI和=tI和 + t元素污染.污染指數
If t元素污染.污染指數>MaxI Then
MaxI=t元素污染.污染指數""計算所有該點元素污染指數的最大值
End If
End If
Next
t污染 =((tI和/t元素cols.count)^2 + MaxI ^2)/2""內梅羅公式
t污染=Sqr(t污染)"根據內梅羅公式計算綜合污染指數
tmrd.AddNew
tmrd.Fields("shape").Value=newshp
If t污染<T指標(4)Then"根據指標定級定色,T指標()的值為綜合分級標准
tmrd.Fields("土壤質量").Value=Labcolor(4).Tag
ElseIf t污染>=T指標(4)And t污染 < T指標(5)Then
tmrd.Fields("土壤質量").Value=Labcolor(5).Tag
ElseIf t污染>=T指標(5)And t污染 < T指標(6)Then
tmrd.Fields("土壤質量").Value=Labcolor(6).Tag
ElseIf t污染>=T指標(6)And t污染 < T指標(7)Then
tmrd.Fields("土壤質量").Value=Labcolor(7).Tag
ElseIf t污染>=T指標(7)Then
tmrd.Fields("土地類型").Value=Labcolor(8).Tag
End If
tmrd.Fields("污染指數").Value=t污染ˊˊˊ評價結果寫入評價圖層文件的屬性表
tmrd.Update
End If
Next
Set tmrd=Nothing
Set tlyr=Nothing
Dim t評價目標Lyr As MapObjects2.maplayer
'把評價結果加入到當前地圖
Set t評價目標Lyr=addShapeFile(m_map,dirname & t評價目標)
Set m_map.CoordinateSystem=OldPrj
Set GClipPoly_prj=Projected(m_map,GClipPoly_unprj)
If Not t評價目標Lyr Is Nothing Then
m_map.Layers.MoveToBottom GetLyrIndex(m_map,t評價目標Lyr.Tag)
End If
tpjstr=dirname & t評價目標
ERR:
Set tmrd=Nothing
Set tlyr=Nothing
Set t評價目標Lyr=Nothing
End Sub
'*************計算單因子污染指數******************************************
Private Function get單因子污染指數(tpoly As MapObjects2.Polygon,t元素名稱 As String,Tscale As Double)As C元素含量
Dim trd As MapObjects2.RecordSet
Dim tmpoly As MapObjects2.Polygon
Dim t元素 As String
t元素=Get元素化學名稱(t元素名稱)翻譯元素化學名稱
Set tmpoly=UnProjected(m_map,m_lyr,tpoly)""'返回投影前的圖形
Set trd=m_lyr.SearchShape(tmpoly,moAreaIntersect,"")""'返回符合空間查詢條件的記錄集
If returnRdEof(trd)Then""返回查詢集是否建立.如假則表示沒建立,退出
Exit Function
End If
Dim t利用現狀 As String
Dim tpH值 As String
Dim t元素含量 As Single
判斷pH值區間范圍
t元素含量=trd.Fields("PH").Value
If t元素含量 <=6.5 Then
tpH值 ="<6.5"
Else
If t元素含量 <=7.5 Then
tpH值 ="6.5-7.5"
Else
tpH值 =">7.5"
End If
End If
t利用現狀=Get利用現狀(tpoly)""返回土地利用現狀,水田或旱地
Dim t評價標准 As String
Dim thl As String
thl=trd.Fields(t元素).Value
If IsNumeric(thl)= False Then
Exit Function
End If
Set get單因子污染指數=New C元素含量
t評價標准=get評價標准(t元素名稱,tpH值,t利用現狀)"獲取評價標准
Get單因子污染指數.元素名稱=t元素名稱
Get單因子污染指數.背景值=t評價標准
Get單因子污染指數.實測值=thl*Tscale
Get單因子污染指數.污染指數=thl/t評價標准*Tscale
End Function
'***********獲取土地利用狀況**********************************************
Private Function Get利用現狀(tpt As MapObjects2.point)As String
Dim lyr As MapObjects2.maplayer
Dim trd As MapObjects2.RecordSet
Dim tQcstr As String
Dim 采樣Nums As Long,水田Nums As Long
Dim tmppoly As MapObjects2.Polygon
Dim tstr1 As String,tstr2 As String
If C_評價目標=土壤環境質量標准值 Or C_評價目標=綠色農產品產地評價 Then
Set lyr=getlyr評價(m_map,Optlyr(0).Caption)
If lyr.Records.Fields("cw").Type=moString Then
tstr1 ="cw='1"'
Else
tstr1 ="cw=1"
End If
If lyr.Records.Fields("LYXZ").Type=moString Then
tstr2 ="(LYXZ ='11'or LYXZ=13)"
Else
tstr2 ="(LYXZ=11 or LYXZ=13)"
End If
Dim tpoly As MapObjects2.Polygon
Dim tmppt As MapObjects2.point
Set tmppt=Projected(m_map,tpt,lyr)
Set tpoly=GetPolytByCentPt(tmppt,1000)
Set tmppoly=UnProjected(m_map,lyr,tpoly)
Set trd=lyr.SearchShape(tmppoly,moAreaIntersect,tstr1)
采樣Nums=ReturnNums(trd)
Set trd=lyr.SearchShape(tmppoly,moAreaIntersect,tstr1 +"and"+ tstr2)
水田Nums=ReturnNums(trd)
If 采樣Nums=0 Then
Get利用現狀 ="旱地"
Exit Function
End If
If 水田Nums/采樣Nums>=0.5 Then
Get利用現狀="水田"
Else
Get利用現狀 ="旱地"
End If
End If
End Function
(三)實例
選取「浙江省農業地質環境調查」項目中蕭山示範區1:5萬表層土壤單點樣測試分析數據、1:5萬表層土壤有機污染物分析數據圖層及1:5萬表層土壤采樣數據圖層作為示例數據。採用比較成熟的內梅羅綜合污染指數法,對蕭山示範區土壤環境質量現狀進行評價。通過土壤環境質量評價,劃分四級土壤(見圖版12),其中,Ⅰ級(安全區)占總面積的85.91%、Ⅱ級(警戒限區)佔9.73%、Ⅲ級(輕污染區)佔4.03%、Ⅳ級(中污染區)佔0.03%。Ⅰ類土壤集中分布於北塘河以北的廣大區域,這是蕭山最重要的土地資源分布區,在蕭山具舉足輕重的地位;Ⅱ類土壤集中分布於蕭山南部,分布比較零散,主要與人類活動有關;Ⅲ類土壤主要分布於蕭山城郊的新塘、來蘇與杜家一帶,與人為因素有關;Ⅳ類土壤主要分布在樓塔岩上一帶,影響其土壤環境質量的主要因素是礦化作用。
⑵ C#資料庫應用程序的開發流程有哪些
C#資料庫應用程序的開發流程一般包括以下步驟:
需求分析:明確開發目標,分析用戶需求,確定需要哪些數據和功能,以及數據量大小和數據流向等。
設計資料庫結構:根據需求分析結果,設計資料庫結構,包括表的結構、表之間的關系、索引等。
編寫代碼:使用C#語言編寫程序,包括連接資料庫、查詢數據、插入數據、更新數據等操作。
調試與測試:在開發過程中進行調試和測試,確保程序能夠正常運行,並且符合用戶需求。
部署與維護:將程序部署到生產環境中,並且進行日常維護和升級,以確保程序的穩定性和安全性。
在開發過程中,還需要注意以下幾點:
數據備份和恢復:確保數據的安全性,制定數據備份和恢復策略。
性能優化:考慮程序的性能問題,採用優化演算法和數據結構,提高程序的運行效率。
安全性:確保程序的安全性,採用加密演算法和身份驗證等措施,防止數據泄露和攻擊。
可擴展性:考慮程序的擴展性問題,設計良好的介面和數據結構,以便後續的升級和擴展。