在MapXtreme 2004的web应用中,都是通过几个隐藏Input将客户端操作发回服务器端的.这几个Input是:
隐藏字段名 |
作用 |
*****_Image_CurrentToolName |
存储当前的用户控件名称: MapInfoWebZoomIn; MapInfoWebPan… |
*****_Image_ToolControlParent |
存储当前控件的父控件名称: ToolbarControl1;未定义…
|
*****_Image_PointsData |
记录用户操作的屏幕坐标集合 |
*****_SelLayers |
存储选择的层 |
***** 为页面定义的Map控件ID,默认为 MapControl1
在以上的字段中,重点是*****_Image_PointsData字段,里面保存的是用户操作所产生的屏幕坐标集合.一般情况下,放大\缩小\平移\框选\圈选产生两个点数据;点选\定位产生一个点数据;测距\多边形选择视操作情况会有多于2个的点数据.数据格式为:
2,162 92,242 138
此数据格式通过逗号分为两个部分.点个数,屏幕坐标,屏幕坐标,…
通过以下方法可以直接拆解为点集合:
Public Function ExtractPoints()Function ExtractPoints(ByVal dataPoints As String) As Point()
If (Not dataPoints Is Nothing) Then
Dim textArray1 As String() = Split(dataPoints, ",")
If (Not textArray1 Is Nothing) Then
Dim num1 As Integer = CInt(textArray1(0))
Dim points As Point() = New Point(num1 - 1) {}
Dim num2 As Integer = 0
Do While (num2 < num1)
Dim textArray2 As String() = Split(textArray1(num2 + 1), " ")
points(num2).X = CInt(textArray2(0))
points(num2).Y = CInt(textArray2(1))
num2 += 1
Loop
return points
End If
End If
return nothing
End Function
If (Not dataPoints Is Nothing) Then
Dim textArray1 As String() = Split(dataPoints, ",")
If (Not textArray1 Is Nothing) Then
Dim num1 As Integer = CInt(textArray1(0))
Dim points As Point() = New Point(num1 - 1) {}
Dim num2 As Integer = 0
Do While (num2 < num1)
Dim textArray2 As String() = Split(textArray1(num2 + 1), " ")
points(num2).X = CInt(textArray2(0))
points(num2).Y = CInt(textArray2(1))
num2 += 1
Loop
return points
End If
End If
return nothing
End Function
拆解出来的点集合是屏幕坐标,通过以下方法可以转化为地理坐标,以便后续使用:
Dim map as MapInfo.Engine.Session.Current.MapFactory(_Alias)
Dim inputPoints() As System.Drawing.Point = ExtractPoints(dataPoints)
Dim exportPoints() As MapInfo.Geometry.DPoint
map.DisplayTransform.FromDisplay(inputPoints, exportPoints)
Dim inputPoints() As System.Drawing.Point = ExtractPoints(dataPoints)
Dim exportPoints() As MapInfo.Geometry.DPoint
map.DisplayTransform.FromDisplay(inputPoints, exportPoints)
_Alias 地图别名,Mapcontrol的mapAlias属性值.
dataPoints 客户端发回的数据
假如开发者对MapX现有的那几个控件不满意,可以通过模拟以上数据格式来自行设计交互的方式.比如:双击放大,右键选中等.当然这样的方法不太正规.还是编写自己的服务器端控件好一点.不过在编写之前了解一些基础知识还是比较好的.