就是算法,网上搜一下经纬度转换成像素的计算方法,很多. 转换成像素后就能用 Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long 切图片了
比如,你用mapx读入gst图 Map1.ConvertCoord转换成屏幕坐标 在根据屏幕坐标使用API Declare Function ScreenToClient Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long 转换成图片的相对坐标.也就是说 你再mapx上选中2个点,那么这两个点在mapx上首先知道的是他的经纬度,根据这个经纬度,获取他图片上的坐标 比如图片大小是1000*800,那么经纬度(35.5,25,5)的点对应图片上坐标可能是(500,600),在根据另外一个点计算出的图片坐标可能是(550,650),那么截的图片就是(500,600)-(550,650)的一个矩形 Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long 可以把这个矩形截出来
转别人的思路:一个gst文件在程序中肯定对应一个map对象。。 map对象有个方法可以获取整个map的边界。好像是map.bounds或者是map.layers.bound 获取边界后,按级别将地图范围分割,举例如下 比如你的map的bounds范围是 左下:120.000000,30.00000 右上 130.00000,40.000000 你可以自己设定 比如地图视野最大的一级(设定为level1)每个图片的跨度是 经度5度,纬度5度, 那么这一级别可以分成4个(根据你设定的第一级跨度的大小,图片个数会对应变化)图片输出,对应的边界分别为 第一个: 左下 120.000000,30.00000 右上 125.00000,35.000000 第二个: 左下 125.000000,30.00000 右上 130.00000,35.000000 第三个: 左下 120.000000,35.00000 右上 125.00000,40.000000 第四个: 左下 125.000000,35.00000 右上 130.00000,40.000000 把它放大一倍则得到第二级(level2)的跨度 是 经度2.5,纬度2.5.同上可以算出可以分成16个图片输出,对应边界的切分同上 每放大一级 跨度是上一级的 1/2,图片个数是上一级的四倍(单个的跨度小了,个数自然多了) 上面是切分的方法。。至于切分后输出,可以如下处理 set map.bounds=.... map.Export 帮助上的例子如下 dim rect as new MapXLib.Rectangle '设置地图边界矩形的正确方式 rect.Set -124.82, 18.08, -52.14, 53.01 set map1.Bounds = rect '此示例展示 Map.ExportMap 方法。它使用 '方法来将地图作为 BMP 文件置于剪贴板中。 Private Sub Command1_Click() Map1.PaperUnit = miUnitCentimeter `Export a 12 cm by 9 cm map to the clipboard in BMP Format Map1.ExportMap "clipboard", miFormatBMP, 12, 9 If Clipboard.GetFormat(vbCFBitmap) Then Debug.Print "Clipboard contains a BMP" Else Debug.Print "Clipboard does not contain a BMP" End If End Sub
转换成像素后就能用
Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
切图片了
Map1.ConvertCoord转换成屏幕坐标
在根据屏幕坐标使用API
Declare Function ScreenToClient Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long
转换成图片的相对坐标.也就是说
你再mapx上选中2个点,那么这两个点在mapx上首先知道的是他的经纬度,根据这个经纬度,获取他图片上的坐标
比如图片大小是1000*800,那么经纬度(35.5,25,5)的点对应图片上坐标可能是(500,600),在根据另外一个点计算出的图片坐标可能是(550,650),那么截的图片就是(500,600)-(550,650)的一个矩形
Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
可以把这个矩形截出来
map对象有个方法可以获取整个map的边界。好像是map.bounds或者是map.layers.bound 获取边界后,按级别将地图范围分割,举例如下
比如你的map的bounds范围是 左下:120.000000,30.00000 右上 130.00000,40.000000
你可以自己设定 比如地图视野最大的一级(设定为level1)每个图片的跨度是 经度5度,纬度5度,
那么这一级别可以分成4个(根据你设定的第一级跨度的大小,图片个数会对应变化)图片输出,对应的边界分别为
第一个: 左下 120.000000,30.00000 右上 125.00000,35.000000
第二个: 左下 125.000000,30.00000 右上 130.00000,35.000000
第三个: 左下 120.000000,35.00000 右上 125.00000,40.000000
第四个: 左下 125.000000,35.00000 右上 130.00000,40.000000 把它放大一倍则得到第二级(level2)的跨度 是 经度2.5,纬度2.5.同上可以算出可以分成16个图片输出,对应边界的切分同上 每放大一级 跨度是上一级的 1/2,图片个数是上一级的四倍(单个的跨度小了,个数自然多了)
上面是切分的方法。。至于切分后输出,可以如下处理
set map.bounds=....
map.Export
帮助上的例子如下
dim rect as new MapXLib.Rectangle
'设置地图边界矩形的正确方式
rect.Set -124.82, 18.08, -52.14, 53.01
set map1.Bounds = rect '此示例展示 Map.ExportMap 方法。它使用
'方法来将地图作为 BMP 文件置于剪贴板中。
Private Sub Command1_Click()
Map1.PaperUnit = miUnitCentimeter
`Export a 12 cm by 9 cm map to the clipboard in BMP Format
Map1.ExportMap "clipboard", miFormatBMP, 12, 9
If Clipboard.GetFormat(vbCFBitmap) Then
Debug.Print "Clipboard contains a BMP"
Else
Debug.Print "Clipboard does not contain a BMP"
End If
End Sub