- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在尝试将 lat/long 点转换为 2d 点,以便可以将其显示在世界图像上——这是一个墨卡托投影。
我已经看到了执行此操作的各种方法以及一些关于堆栈溢出的问题 - 我尝试了不同的代码片段,虽然我得到了正确的像素经度,但纬度总是偏离似乎越来越多不过合理。
我需要公式来考虑图像大小、宽度等。
我试过这段代码:
double minLat = -85.05112878;
double minLong = -180;
double maxLat = 85.05112878;
double maxLong = 180;
// Map image size (in points)
double mapHeight = 768.0;
double mapWidth = 991.0;
// Determine the map scale (points per degree)
double xScale = mapWidth/ (maxLong - minLong);
double yScale = mapHeight / (maxLat - minLat);
// position of map image for point
double x = (lon - minLong) * xScale;
double y = - (lat + minLat) * yScale;
System.out.println("final coords: " + x + " " + y);
在我正在尝试的示例中,纬度似乎偏离了大约 30 像素。有什么帮助或建议吗?
更新
基于这个问题:Lat/lon to xy
我已经尝试使用提供的代码,但我仍然遇到一些纬度转换问题,经度很好。
int mapWidth = 991;
int mapHeight = 768;
double mapLonLeft = -180;
double mapLonRight = 180;
double mapLonDelta = mapLonRight - mapLonLeft;
double mapLatBottom = -85.05112878;
double mapLatBottomDegree = mapLatBottom * Math.PI / 180;
double worldMapWidth = ((mapWidth / mapLonDelta) * 360) / (2 * Math.PI);
double mapOffsetY = (worldMapWidth / 2 * Math.log((1 + Math.sin(mapLatBottomDegree)) / (1 - Math.sin(mapLatBottomDegree))));
double x = (lon - mapLonLeft) * (mapWidth / mapLonDelta);
double y = 0.1;
if (lat < 0) {
lat = lat * Math.PI / 180;
y = mapHeight - ((worldMapWidth / 2 * Math.log((1 + Math.sin(lat)) / (1 - Math.sin(lat)))) - mapOffsetY);
} else if (lat > 0) {
lat = lat * Math.PI / 180;
lat = lat * -1;
y = mapHeight - ((worldMapWidth / 2 * Math.log((1 + Math.sin(lat)) / (1 - Math.sin(lat)))) - mapOffsetY);
System.out.println("y before minus: " + y);
y = mapHeight - y;
} else {
y = mapHeight / 2;
}
System.out.println(x);
System.out.println(y);
使用原始代码时,如果纬度值为正,则返回负点,因此我对其稍作修改并使用极纬度进行了测试——应该是点 0 和点 766,它工作正常。但是,当我尝试不同的纬度值例如:58.07(就在英国北部)时,它显示为西类牙北部。
最佳答案
The Mercator map projection is a special limiting case of the Lambert Conic Conformal map projection with the equator as the single standard parallel. All other parallels of latitude are straight lines and the meridians are also straight lines at right angles to the equator, equally spaced. It is the basis for the transverse and oblique forms of the projection. It is little used for land mapping purposes but is in almost universal use for navigation charts. As well as being conformal, it has the particular property that straight lines drawn on it are lines of constant bearing. Thus navigators may derive their course from the angle the straight course line makes with the meridians. [1.]
从球面纬度 φ 和经度 λ 推导出东向和北向投影坐标的公式是:
E = FE + R (λ – λₒ)
N = FN + R ln[tan(π/4 + φ/2)]
其中 λO 是自然起源的经度,FE 和 FN 是东偏和北偏。在球形墨卡托中,实际上并没有使用这些值,因此您可以将公式简化为
伪代码示例,因此可以适应每种编程语言。
latitude = 41.145556; // (φ)
longitude = -73.995; // (λ)
mapWidth = 200;
mapHeight = 100;
// get x value
x = (longitude+180)*(mapWidth/360)
// convert from degrees to radians
latRad = latitude*PI/180;
// get y value
mercN = ln(tan((PI/4)+(latRad/2)));
y = (mapHeight/2)-(mapWidth*mercN/(2*PI));
来源:
编辑用 PHP 创建了一个工作示例(因为我不擅长 Java)
https://github.com/mfeldheim/mapStuff.git
EDIT2
关于java - 将纬度/经度点转换为墨卡托投影上的像素 (x,y),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14329691/
我正在寻找有关为什么在这些网站上讨论了 2 种不同的墨卡托公式的解释。 我理解这是正确的墨卡托投影算法: http://en.wikipedia.org/wiki/Mercator_projectio
我正在使用 Alan McConchie's d3 中的基本墨卡托 map block 。我已经让它在本地工作,但我试图过滤 map 以排除某些国家(例如南极洲)。 我不想简单地从 json 文件中删
我想在我的应用程序中使用球面墨卡托算法将纬度/经度点投影到 2D 平面。 球形墨卡托也称为 Google 墨卡托、EPSG-900913 或 EPSG-3785。 有几个页面介绍了如何通过 OpenL
我的程序垂直拉伸(stretch)一个 Numpy 数组,代表一个 180 x 360 的 map 图像,因此它代表一个 Web Mercator map 图像。 我编写了一个函数(如下),它可以完成
我正在尝试将地理坐标系转换为 Esri Webmercator,但是当我进行转换时,生成的 x 和 y 的值为 0000003232112222… 和 00000012665321…。这很奇怪,因为坐
我是一名优秀的程序员,十分优秀!