<< VB.NET 2008 Express | top | VB.NET 2008 Express(続き) >>

接触(touch)の判定


shapeObj.touches(shapeObj)を使うと、二つのオブジェクトが接しているかの判定を行うことができます。

ここに、座標系の異なる2つの地図データがあるとします。
・地図1:道路の線形(世界測地系;JGD2000)
・地図2:道路の節点(世界測地系平面直角7系)
地図描画上は、MapServerのオンザフライのおかげで、ちゃんと重なって見えます。
いま、この2つの地図を使って、道路の線形に対して接している節点が欲しいとしたとき、次のようにすると、節点を見つけることができません。

'道路区間を検索のもととする
map.getLayerByName("道路区間").open()
map.getLayerByName("道路区間").whichShapes(_rect)
_shape = map.getLayerByName("道路区間").nextShape

_rect2 = _shapee.bounds '対象の道路区間の範囲を検索範囲とする

'道路節点のすべてのデータをループ
map.getLayerByName("道路節点愛知").open()
map.getLayerByName("道路節点愛知").whichShapes(_rect2)
_shape2 = map.getLayerByName("道路節点愛知").nextShape

Do Until _shape2 Is Nothing

Dim _intKekka As Integer
_intKekka = _shape.touches(_shape2)
If _intKekka = mapscript.MS_TRUE Then
_intCount += 1
MsgBox(_shape.getValue(0).ToString & ":" & _shape2.getValue(0).ToString)
End If
_shape2 = map.getLayerByName("道路節点愛知").nextShape
Loop

map.getLayerByName("道路節点").close()
map.getLayerByName("道路区間").close()
ためしに、shapeObj.project を使って投影変換をしてから、判定させてみました。

'新世界測地系緯度経度から
Dim _proj_sekai As New projectionObj("init=epsg:4612")
'新世界測地系平面直角第7系
Dim _proj_7kei As New projectionObj("init=epsg:2449")
Dim _intKekka0 As Integer

_intKekka0 = _shape.project(_proj_7kei, _proj_sekai)
Dim _shapeClone As shapeObj
_shapeClone = _shape.clone

Do Until _shape2 Is Nothing

Dim _intKekka As Integer
_intKekka = _shapeClone.touches(_shape2)
If _intKekka = mapscript.MS_TRUE Then
_intCount += 1
MsgBox(_shapeClone.getValue(0).ToString & ":" & _shape2.getValue(0).ToString)
End If
_shape2 = map.getLayerByName("道路節点愛知").nextShape
Loop

結果は、これでも接している点を見つけることができませんでした。

原因は、projectで変換させた後の座標値が、小さな誤差を生じており、2つの地図が見た目上は重なっていても、touchesの判定が厳密なためみつからないということでした。

touches のほか、幾何計算を行う他の関数も同様のことがおきえそうと言えます。
注意が必要です。
bugna | MapScript | 13:19 | comments(0) | trackbacks(0) | - | - |
Comment









Trackback
URL:

11
--
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
--
>>
<<
--