`
Rainbow702
  • 浏览: 1076559 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类

如何用metersToEquatorPixels实现任意纬度的米到像素的转换

阅读更多

今天又是神奇的发现:我希望在MapView的Overlay子类里画一个半径为 R米 的圆,于是用 metersToEquatorPixels 函数,将一个距离  R米 转换为一个以当前缩放等级下像素为单位的距离。调用的时候也没太注意,结果画出来的圆确实让我费解了阵子,仔细一看发现Equator这个单词,于是大概有点明白了。查了一下etersToEquatorPixels 函数的解释:该方法把以米为计量单位的距离(沿赤道)在当前缩放水平下转换到一个以像素(水平)为计量单位的距离。在默认的Mercator投影变换下,对于给定的距离,当远离赤道时,变换后确切的像素数量会增加。

SO,解决办法就是要将赤道,也就是零纬度的米对应的像素距离换算成我们需要的纬度的 米 对应的像素距离。我们可以写这么一个方法来实现:

 

public static int metersToRadius(float meters, MapView map, double latitude)  {  
    return (int) (map.getProjection().metersToEquatorPixels(meters) /(Math.cos(Math.toRadians(latitude))));  
} 

 

 

 
当然重点就是 /(Math.cos(Math.toRadians(latitude))) 这一串了。其实看了下面的这幅图,结合一下初高中的几何知识,不难明白为什么要这么写。



 

以上转自: http://cosyattic.com/archives/152

 

以下原创:

 

其实也可以这么理解,根据“GOOGLE MAP 源码”(关于源码,请参见:http://rainbow702.iteye.com/blog/1124280),我们可以看到该方法的实现:

public float metersToEquatorPixels(float meters) {
    return (float)meters*circumference /CIRCUMFERENCE_IN_METERS);
}

 

而 circumference 与 CIRCUMFERENCE_IN_METERS 又分别是什么呢?如下:

private static final double CIRCUMFERENCE_IN_METERS = 40075160.0;
private int tiles = 1 << zoomLevel;
private double circumference = tileSize * tiles;

 

 其中, zoomLevel 是你的 MapView 当前的缩放比例,tileSize 定义如下:

private MapSourceInfo mapSourceInfo = new CloudmadeSourceInfo("b06a3135a4eb5848a225483969f56967");
private int tileSize = mapSourceInfo.getTileSize();

CloudmadeSourceInfo 类的定义如下:
class CloudmadeSourceInfo implements MapSourceInfo {
    private final String apiKey; 
    private final int tileSize;
    private final int style;
    private final String attribution = 
      "\u00a9 2009 CloudMade - Map data CC-BY-SA 2009\nOpenStreetMap.org contributors - Terms of Use";
    
    CloudmadeSourceInfo(String apiKey) {
        this(apiKey, 256);
    }
    CloudmadeSourceInfo(String apiKey, int tileSize) {
        this(apiKey, tileSize, 1);
    }
    CloudmadeSourceInfo(String apiKey, int tileSize, int style) {
        this.apiKey = apiKey;
        this.tileSize = tileSize;
        this.style = style;
    }
    public int getMaxZoom() {
        return 18;
    }

    public String getName() {
        return "Open Street Maps Cloudmade renderer";
    }

    public String getTileUri(int x, int y, int zoom) {
        return "http://b.tile.cloudmade.com/"+ apiKey +"/" + style + "/" + tileSize + "/" + zoom + "/" + x + "/" + y + ".png";
    }

    public int getTileSize() {
        return tileSize;
    }

    public String getAttribution() {
      return attribution;
    }

}

 

所以,假设赤道的半径为 R,我们所处的纬度为 α 度的平面(如上图红线所画的平面)的半径为 r,那么应该有以下等式成立(请再看一下metersToEquatorPixels的实现):

meters * (circumference /2πR) = P
meters * (circumference / 2πr) = p

 以上,P 是在赤道上 meters 米对应的像素的长度,而 p 是在 α 度纬度上 meters 米对应的像素的长度,进而可以得出以下等式:

2πR * P = 2πr * p

 从而,最终得出以下等式:

2πR * P = 2πr * p

p = (R / r) * P

 那么, (R / r) 是什么呢,请看上图,只要是学习简单的立体几何的人应该都可以看来吧。对,它就等于 sec (α), 亦即原帖中所得的结果 1/cos (α)。

 

这样一来,大家都应该知道是怎么一回事了吧。希望对看到这篇博客的人有所帮助。

  • 大小: 9.8 KB
分享到:
评论
2 楼 Spring_eye 2013-04-15  
牛逼啊,赞一个
1 楼 Rainbow702 2011-07-28  
Math.cos(Math.toRadians(latitude))  这里之所以要使用 toRadians 方法,是因为 cos 的参数要求是以弧度为单位的。

相关推荐

    谷歌地图经纬度到像素转换

    谷歌地图经纬度到像素转换 ...谷歌地图经纬度到像素转换是通过上述公式实现的。这些公式将经纬度坐标转换为像素坐标,以便在地图上显示正确的位置信息。开发者可以根据需求选择合适的转换公式,以满足不同的应用场景。

    经纬度到像素坐标的转换.doc

    经纬度到像素坐标的转换是一个复杂的过程,需要使用不同的方法和公式来进行转换。本文讨论了两种方法:公式转换法和坐标原点法,并且提供了距离计算法来计算两点之间的实际地理空间距离。这些方法和公式可以帮助我们...

    用于在坐标系之间转换的 openFrameworks 插件:纬度_经度、轴_角度、四元数、笛卡尔 .zip

    四元数到欧几里得向量(笛卡尔坐标)的转换允许我们用简洁且无损的方式处理旋转。 4. **笛卡尔坐标转换**:笛卡尔坐标是最常见的3D空间表示方式,通过x、y、z三个轴定义点的位置。转换可能涉及到不同坐标系下的原点...

    百米制坐标转换为经纬度坐标

    百度米制坐标转WGS84/火星经纬度坐标,BD02(火星坐标系)/WGS84百米制转换。

    经纬度转像素 + web前端定位插件

    这个工具可能提供了便利的方法,使开发者能够轻松地将接收到的经纬度数据转换为在特定地图上显示的像素坐标,从而在前端实现动态的地理定位功能。 总的来说,经纬度转像素和Web前端定位插件是现代Web应用中实现地理...

    WGS84坐标系与任意坐标系坐标转换

    2. **大地坐标与空间直角坐标转换**:在从WGS84坐标转换到任意坐标系的过程中,还需将WGS84空间直角坐标转换为大地坐标(纬度、经度、高程)。这一转换基于椭球体模型,通过迭代法计算得出。 #### 五、结论 在地质...

    C#实现坐标转换

    本文将深入探讨如何使用C#编程语言,结合Winform图形用户界面,实现不同坐标系之间的转换,包括从任意坐标系到54坐标系、80坐标系以及54坐标系到80坐标系的转换。 首先,我们要理解坐标转换的基本概念。坐标转换...

    C#经纬度坐标与大地坐标相互转换工具

    C#中的坐标转换工具实现这一功能,通常会涉及到以下几个步骤: 1. **坐标系定义**:明确输入和输出坐标系的类型,如经纬度(WGS84)和CGCS2000。 2. **椭球参数**:每个大地坐标系都基于特定的地球椭球模型,如...

    平面坐标与经纬度的转换

    本篇将详细介绍C#如何通过调用DLL进行这两种坐标之间的转换,以及涉及到的椭球体选择和投影方式。 首先,让我们理解一下平面坐标和经纬度。平面坐标系统,如笛卡尔坐标系,通常由X轴和Y轴构成,适用于二维平面上的...

    GPS坐标转换工具 经纬度XY坐标转换工具 度分秒 经纬度 米 转换工具

    5. 米与其它长度单位转换:在GIS中,距离的测量通常使用米作为基本单位,但有时也需要转换为公里、英里、码等其他长度单位。这涉及到国际单位制和英美单位制的换算。 6. 坐标转换工具:这种工具能够处理多种坐标系...

    mysql常用坐标系转换函数.docx

    MySQL中的这两个函数——`84togcj2Lat`和`84togcj2Lon`,专门用于实现WGS84到GCJ02(也称为火星坐标系)的转换。 WGS84是全球最广泛使用的地理坐标系统,它是基于地球椭球体模型的,其中地球的平均半径约为6378.1...

    坐标转换与经纬度转换工具.zip

    “经纬度与XY转换.exe”是一个应用程序,能够实现地理坐标(经度/纬度)与平面坐标(X/Y)的相互转换。这在地图制作、GPS定位等场景中非常实用。 “cn.cod”可能是一个包含中国特定坐标转换规则或参数的代码文件。 ...

    大地坐标与经纬度坐标转换

    "大地坐标与经纬度坐标转换"涉及到的主要概念是地理坐标系统和投影坐标系统的差异以及它们之间的转换方法。 1. **地理坐标系统**:以地球为参照对象的坐标系统,通常使用经纬度来表示位置。经纬度坐标系是一种球面...

    C#实现坐标转换,七参数之间进行数据转换

    本话题主要探讨了如何使用C#编程语言实现坐标转换,特别是通过七参数法来处理不同的坐标系统之间的转换。以下是对这个主题的详细阐述: 一、坐标系统与坐标转换 1. 坐标系统:地球是一个不规则的三维形状,为了方便...

    C++大地坐标转换经纬度源码

    本话题主要涉及的是使用C++编程语言实现的大地坐标与经纬度之间的转换算法。大地坐标系通常指的是笛卡尔坐标系,而经纬度是地理坐标系中的表示方式,用于描述地球上的位置。下面将详细讨论这两种坐标系的原理以及...

    基于MATLAB的WGS84坐标到地方坐标的转换.pdf

    MATLAB在地理信息系统(GIS)中的应用非常广泛,特别是在坐标转换方面,它能够提供强大的数学模型支持和算法实现。本文研究的是在政务地理信息工程建设中,如何将WGS-84坐标数据转化为地方坐标数据,这是一个常遇到...

    js地理坐标与屏幕坐标互转换

    在ArcGIS JavaScript API中,地理坐标与屏幕坐标的相互转换是一项重要的功能,它允许开发者将地图上的地理位置(经纬度)转换为用户界面中的像素位置,反之亦然。这对于实现地图交互、绘制图形以及进行空间分析等...

    大地坐标转经纬度坐标visual C++源码

    本文将详细介绍一个使用Visual C++实现的大地坐标转经纬度坐标的源码。大地坐标系统(也称为高斯-克吕格坐标系统)是地理测绘中常用的一种坐标系,而经纬度坐标则是我们日常生活中更常见、更直观的定位方式。了解...

    arcgis中经纬度到平面坐标之间的转换

    这一过程通常涉及到定义特定的转换参数,例如七参数(也称为布尔莎模型),并使用相应的工具来执行转换。 #### 三、坐标转换的关键注意事项 在进行坐标转换之前,有几点需要注意: 1. **坐标格式**:WGS84的经纬度...

    XYZ与BLH的转换_XYZ与BLH的转换_stagecdm_坐标转换_

    - 计算大地纬度φ和大地经度λ,这通常涉及到椭球坐标到地理坐标的转换。 - 通过大地纬度和大地经度找到大地高B,这可能需要用到大地水准面的曲率公式。 - 通过B和XYZ坐标,计算水准高H。这一步可能需要用到椭球...

Global site tag (gtag.js) - Google Analytics