地图坐标与屏幕坐标的转换&&控制地图显示范围的参数

再开始这个话题之前,先提出一个问题:给你一副地图,里面的每个要素的坐标都已知,怎么把这幅地图在屏幕上显示出来?由此就引出了地图坐标与屏幕坐标的转换,它是GIS底层实现中调用频率最高的运算,地图渲染、浏览、要素选择、编辑等都会涉及到它,这个算法的实现效率,直接关系到整个系统的性能。

 

现在回答文章开头提到那个问题。首先,已知当前显示的地图范围是多少,即HW、(x0,y0)已知;然后,已知当前屏幕画布的大小,即已知H’W’;这样就可以得到地图坐标(x,y) 到屏幕坐标(x’,y’) 转换公式,把每个要素的地图坐标都转换到屏幕坐标,并被渲染出来。

在画布大小没有改变的情况下(H’W’不变),随着地图的放大、缩小、平移等操作,地图范围在不断地改变,即HW、(x0,y0)在改变,转换公式的也随之改变。

我们又经常要把屏幕坐标转成地图坐标,比如,我们在地图上添加一个点要素,需要在屏幕上按一下鼠标,确定这个点的位置,这个时候就需要把当前鼠标按下的位置即屏幕坐标,通过上面的公式,转换成地图坐标保存。再比如,点选工具,也是先在地图上按一下鼠标来选择,把鼠标按下的位置,即屏幕坐标转成地图坐标,然后用地图坐标查询空间索引,缩小搜索的范围,比较距离当前鼠标位置最近的要素,即为被选择的要素。

总之,地图坐标与屏幕坐标的转换,是GIS中最常调用的接口,不管是底层开发还是二次开发,都会经常涉及到。下一节,我们将重点介绍控制地图显示的几个重要参数。

控制地图显示范围的参数

陈玉进 李泉 南京跬步科技有限公司(http://www.creable.cn

原文链接:http://hi.baidu.com/geochenyj/blog/item/6b5c5c1294057557f819b835.html

控制地图显示范围有几个重要的参数:1Zoom,当前视窗显示的地图范围的宽度;2Center,当前视窗显示的地图范围的中心点;3CurrentRange,当前视窗显示的地图范围。下面我们详细介绍这几个参数的涵义、相互关系、以及如何控制地图显示范围。

这三个参数之间有什么关系?下面我们通过一个题目来说明。

已知当前视窗的地图中心点Center的坐标(X中心,Y中心)、地图范围的宽度Zoom、以及视窗屏幕画布的大小Size,求当前视窗的显示范围CurrentRange,即CurrentRange.XminCurrentRange.YminCurrentRange.XmaxCurrentRange.Ymax

解:CurrentRange.Width = Zoom

    CurrentRange.Xmin = X中心Zoom/2

        CurrentRange.Xmax = X中心Zoom/2

        PixelWidth为一个象素横向所代表的实际地图宽度、PixelHeight为一个象素纵向所代表的实际地图高度,为了保持要素显示的不变形,要求PixelWidth = PixelHeight

         CurrentRange.Width / Size.Width = CurrentRange.Height / Size.Height

         Zoom / Size.Width = CurrentRange.Height / Size.Height

         CurrentRange.Height (Zoom / Size.Width) * Size.Height

         CurrentRange.YminY中心—CurrentRange.Height/2

        CurrentRange.YmaxY中心CurrentRange.Height/2

通过以上这道题目的求解,使我们认识到,ZoomCenterCurrentRange这三个参数使紧密关联的,只要改变其中任意一个参数,其他两个中至少有一个会改变,设置这些参数的值,是我们控制地图显示范围的重要手段,所以,经常在二次开发过程中采用到。

 

请大家再思考一个问题:地图在用放大工具放大的时候,如果拉出的放大框是一个狭长的矩形,那放大后的结果会是怎样?以上三个参数发生了怎样的改变?

解:根据人的视觉和心理习惯,中心点,即为这个放大框的矩形中心点,通过屏幕坐标转地图坐标求出(X中心,Y中心)

 

如果拉出的放大框是一个横向狭长的矩形,就以横向为标准;

则横向跨度Zoom即为放大框所包含的地图宽度(通过屏幕坐标转地图坐标,计算出放大框所包含的横向跨度Zoom,即CurrentRange.Width);

    纵向跨度CurrentRange.Height

    PixelWidth为一个象素横向所代表的实际地图宽度、PixelHeight为一个象素纵向所代表的实际地图高度,为了保持要素显示的不变形,要求PixelWidth = PixelHeight

        Zoom / Size.Width = CurrentRange.Height / Size.Height

        CurrentRange.Height  (Zoom / Size.Width) * Size.Height

        这样,控制地图显示范围的三个参数都可以求出;

 

        如果拉出的放大框是一个纵向狭长的矩形,就以纵向为标准;

        则纵向跨度CurrentRange.Height即为放大框所包含的地图高度(通过屏幕坐标转地图坐标,计算出放大框所包含的纵向跨度);

        横向跨度CurrentRange.Width Zoom,

        Zoom / Size.Width = CurrentRange.Height / Size.Height

        Zoom = (CurrentRange.Height / Size.Height) * Size.Width

        这样,控制地图显示的三个参数也可以求出

 

以上讨论的都是在不改变显示屏幕画布的情况下,如果我们改变一下显示屏幕的画布大小,地图的显示范围该如何变化?以上三个参数又该发生怎样的改变?

解:前提是不管屏幕画布怎么改变,Zoom始终不变、中心点始终不变;

 

    如果横向上拉伸或缩小,横向跨度Zoom没有改变,改变的是PixelWidth(一个象素横向所代表的实际地图宽度);

    横向拉伸Size.Width变大,则PixelWidthZoom/Size.Width变小,纵向上Size.Height没变,又由于PixelHeight=PixelWidth,所以Size.Height*PixelHeight变小,高度变矮了;

    横向缩小,PixelWidth变大,纵向上Size.Height没变,又由于PixelHeight=PixelWidth,所以Size.Height*PixelHeight变大,高度变高了;

 

    如果纵向上拉伸或压扁,由于横向上Zoom的值没有改变,横向的Size.Width的值也没改变,横向上PixelWidth就不会改变,由于PixelHeight=PixelWidth,纵向上的拉伸,Size.Height*PixelHeight变大,导致纵向上显示内容变多,反之,变少

以上分析了控制地图显示范围的三个参数,以及画布或拉框浏览对显示范围的影响,在GIS二次开发中经常会遇到,这些考虑都是按照人的视觉和心理习惯来设计的,读者也可以完全不这样做,可以有自己的设计,这个主动权在您自己手里。

http://www.cnblogs.com/yhlx125/articles/2579592.html

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 iOS 高德地图 SDK 中,可以使用 `MAMapView` 对象进行地图显示和交互。该对象提供了一些方法可以实现坐标转换屏幕像素的功能。 以下是将地图上的经纬度坐标转换屏幕像素的示例代码: ```objective-c // 初始化一个 MAMapView 对象 MAMapView *mapView = [[MAMapView alloc] initWithFrame:self.view.bounds]; // 创建一个 CLLocationCoordinate2D 类型的坐标 CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(39.908692, 116.397477); // 将经纬度坐标转换屏幕像素 CGPoint point = [mapView convertCoordinate:coordinate toPointToView:self.view]; NSLog(@"Screen point: %@", NSStringFromCGPoint(point)); ``` 以上代码中,`convertCoordinate:toPointToView:` 方法可以将地图上的经纬度坐标转换为在当前视图中的屏幕像素坐标。其中 `toPointToView:` 参数表示需要转换到的视图对象,这里使用 `self.view` 表示当前视图。 除了将经纬度坐标转换屏幕像素,还可以使用 `convertPoint:toCoordinateFromView:` 方法将屏幕像素坐标转换地图上的经纬度坐标。示例代码如下: ```objective-c // 创建一个 CGPoint 类型的屏幕像素坐标 CGPoint point = CGPointMake(100, 200); // 将屏幕像素坐标转换地图上的经纬度坐标 CLLocationCoordinate2D coordinate = [mapView convertPoint:point toCoordinateFromView:self.view]; NSLog(@"Coordinate: %f, %f", coordinate.latitude, coordinate.longitude); ``` 以上代码中,`convertPoint:toCoordinateFromView:` 方法可以将屏幕像素坐标转换地图上的经纬度坐标。其中 `toCoordinateFromView:` 参数表示需要转换的视图对象,这里同样使用 `self.view` 表示当前视图。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值