我目前正在开发一个"行程跟踪器"。目标是将一些GPS坐标(由GPS设备记录)放置在从MapQuest(或OpenStreetMap)下载的静态图像地图上。为了实现这个目标,我遵循了以下程序:
- 查找我的GPS坐标集的中心((maxLat minLat)/2,(maxLon minLon)/2)
- 从MapQuest下载一张以我的"坐标集中心"为中心的3840x3840地图(目前固定缩放15)
- 使用mercator投影(我用EPSG:4326或EPSG:3857尝试球面和椭圆),得到中心的(X,Y),单位为米
- 对于我的每一个点
- 使用mercator投影获得点的(X,Y)
- 将点(X,Y)减去中心(X,Y)
- 根据缩放级别和贴图(平铺?)宽度将米转换为像素(我尝试了平铺宽度(256)和贴图宽度(3840)
不幸的是,在一周的研究中;尝试,我没有成功地提出这些观点。
有人能完全解决这类问题吗?
谢谢
编辑#1
(已删除:不一致)
编辑#2
这是一个干净的项目样本
https://dl.dropboxusercontent.com/u/429726/MapSample.zip
- 该路径旋转90°(欺骗@MainWindow.xaml.cs:L130)
- 路径变平
Img:https://dl.dropboxusercontent.com/u/429726/MapSample.jpg
编辑#3
添加了多个公式
GeographicCoordinates>ToMercator()修改
public System.Windows.Point ToMercator(int test = 0)
{
System.Windows.Point mercator;
double x = this.Longitude.ToMercator(test);
double y = this.Latitude.ToMercator(test);
mercator = new System.Windows.Point(x, y);
return mercator;
}
GeographicCoordinate>ToMercator()修改
public double ToMercator(int test = 0)
{
double result = 0;
switch (this.Type)
{
case(GeographicCoordinateType.Longitude):
switch (test) {
case 0:
return this.DecimalDegrees.ToRadians() * Maps.EarthGreatRadius;
case 1:
//http://jackofalltradesdeveloper.blogspot.be/2012/03/how-to-project-point-from-geography-to.html
return this.DecimalDegrees * 0.017453292519943 * 6378137;
case 2:
//http://alastaira.wordpress.com/2011/01/23/the-google-maps-bing-maps-spherical-mercator-projection/
return this.DecimalDegrees * 20037508.34 / 180;
}
break;
case(GeographicCoordinateType.Latitude):
switch (test)
{
case 0:
double latitude = this.DecimalDegrees;
if (latitude > 89.5)
{
latitude = 89.5;
}
if (latitude < -89.5)
{
latitude = -89.5;
}
double temp = Maps.EarthGreatRadius / Maps.EarthGreatRadius;
double es = 1.0 - (temp * temp);
double eccent = Math.Sqrt(es);
double phi = latitude.ToRadians();
double sinphi = Math.Sin(phi);
double con = eccent * sinphi;
double com = 0.5 * eccent;
con = Math.Pow((1.0 - con) / (1.0 + con), com);
double ts = Math.Tan(0.5 * ((Math.PI * 0.5) - phi)) / con;
double y = 0 - Maps.EarthGreatRadius * Math.Log(ts);
return y;
case 1:
double FSin = Math.Sin(this.DecimalDegrees.ToRadians());
return 6378137 / 2.0 * Math.Log((1.0 + FSin) / (1.0 - FSin));
case 2:
y = Math.Log(Math.Tan((90 + this.DecimalDegrees) * Math.PI / 360)) / (Math.PI / 180);
return y * 20037508.34 / 180;
}
break;
default:
throw new Exception();
}
return result;
}
编辑#4
我试过倍数公式&Proj.Net库,我总是以相同的形状结束(-90°&&"扁平化")
地图坐标也需要转换为mercator。您需要地图的delta x和delta y以及图像属性:将纬度/经度转换为像素坐标?。
我过去曾使用它在WindowsForm客户端的地图上构建信息:
http://greatmaps.codeplex.com/
以下是的答案
地理坐标>ToMercator()
public System.Windows.Point ToMercator(int test = 0)
{
System.Windows.Point mercator;
double x = this.Longitude.ToMercator(test);
double y = this.Latitude.ToMercator(test);
mercator = new System.Windows.Point(x, y);
return mercator;
}
应该是
public System.Windows.Point ToMercator(int test = 0)
{
System.Windows.Point mercator;
double x = this.Latitude.ToMercator(test);
double y = this.Longitude.ToMercator(test);
mercator = new System.Windows.Point(x, y);
return mercator;
}
而且GeographicCoordinate>ToMercator()应交换GeographicCoordinateType.Latitude/Litude情况。
我还必须根据半球修复Y
&工作完成了。