地图中的偏移问题的解决和源码(C#)

原创 2012年03月27日 15:41:28

在Google 地图中国部分,平面地图和卫星图都存则偏移量,而这个偏移量不是线性的,我们在做GPS定位平台的时候,在播放历史轨迹的时候往往发现车辆行驶的路线偏离了地图上的实际道路,这点是很多客户不能接受的,如何解决这个问题呢。

我们首先要解决两个问题,一个是偏移量数据的问题,二是计算实际应该显示经纬度的算法

1. 如何获得偏移量数据。
Google 已经有一个偏移纠正的API,如 http://ditu.google.cn/maps/vp?spn=0.0,0.0&z=18&vp=39.111195,117.148067,通过这个API,返回的是 以下的格式:

39.111195, 117.148067, 18, [9, -2, 18, -4, 37, -8, 74, -16, 149, -33, 298, -67, 596, -135, 1193, -270]
以上的数据的含义是几个放大级别的偏移量:
18级: 1193, -270
17级: 596, -135
16级: 298, -67
15级: 149, -33
14级: 74, -16
13级: 37, -8
12级: 18, -4
11级: 9, -2


一般情况来说,我们为了得到比较高的精度度,会取 18级别的数据1193,-270,1193为x方向上精度的偏移像素,-270为y方向上维度偏移像素。


由这个数据计算39.111195,117.148067在偏移之后的经纬度为39.11231854918217,117.15446412563324,具体的算法源码如下:


2. 算法和源码
首先,我们会建一个表Offset,这个表会存所有经纬度偏移量的数据,格式如下:

53.12 120.61 1321 -461
53.12 120.62 1322 -462
53.12 120.63 1324 -465
53.12 120.64 1327 -468
53.12 120.65 1331 -473
53.12 120.66 1336 -478

在上表中,我们存的都是18级的偏移量数据,而我们在存经纬度的时候精确到0.01, 例如,我们的经纬度是 52.12123213, 120.6123123, 我们会取 52.12,120.61 的偏移量去计算偏移后的经纬度。
源码如下:

public decimal[] GetLatLng(decimal lat, decimal lng)
{
int PX, PY;

int OX = 0;
int OY = 0;

int PX1, PY1;

decimal[] LatLng = new decimal[] { lat, lng };

string oXY = “”;
string Lat = lat.ToString().Substring(0, lat.ToString().IndexOf(‘.’) + 3);
string Lng = lng.ToString().Substring(0, lng.ToString().IndexOf(‘.’) + 3);

if (CacheManager.Get(Lat + “_” + Lng) != null)
{
oXY = CacheManager.Get(Lat + “_” + Lng).ToString();
}

try
{
Database db = DatabaseFactory.CreateDatabase();
string sqlCmd = “SELECT TOP 1 X,Y FROM Offset WHERE Lat=” + Lat + ” AND Lng=” + Lng;
DbCommand dbCmd = db.GetSqlStringCommand(sqlCmd);
using (IDataReader dr = db.ExecuteReader(dbCmd))
{
if (dr.Read())
{
OX = DataReaderHelper.GetInt32(dr, “X”);
OY = DataReaderHelper.GetInt32(dr, “Y”);

oXY = OX.ToString() + “,” + OY.ToString();
CacheManager.Permanent(Lat + “_” + Lng, oXY);
}
}

if (OX != 0 && OY != 0)
{
Map.LatLongToPixelXY(Convert.ToDouble(lat), Convert.ToDouble(lng), 18, out PX, out PY);

PX1 = PX + OX;
PY1 = PY + OY;

LatLng[0] = Convert.ToDecimal(Map.PixelYToLat(PY1, 18));
LatLng[1] = Convert.ToDecimal(Map.PixelXToLng(PX1, 18));
}
}
catch (Exception ex)
{
ExceptionHandler.ExceptionProcess(ex);
}

return LatLng;
}


http://www.lbsgps.org/?p=418


相关文章推荐

基于Qt的车载GPS监控系统(1)项目介绍

基于Qt的车载GPS监控系统(1)项目介绍 项目实践说明: 本实践项目是嵌入式开发培训(阶段3)嵌入式图形应用开发视频课程的综合实践项目。 项目开发使用的技术知识点包括:C++语言...

C#中的object类深入理解

C#中所有的类都直接或间接继承自System.Object类,这使得C#中的类得以单根继承。如果我们没有明确指定继承类,编译器缺省认为该类继承自System.Object类。System.Object...
  • WnLn25
  • WnLn25
  • 2011年08月11日 11:36
  • 26389

C# WinForm 解决TextureBrush,FillRectangle绘图偏移问题

FillRectangle方法 最近在开发WinForm软件中遇到使用FillRectangle方法窗体绘制园角图象的时候总是发生偏移错位问题,使我头疼了半天,其现象如下: WinForm 解...

GPS经纬度及谷歌地图坐标转换为百度地图坐标,解决地图显示经纬度的偏移问题

最近做项目中遇到的一个问题,即测量得到的经纬度值在百度地图上出现了偏移,是所有经纬度点整体的偏移,上网搜了,得知如下的情况:        国内出版的各种地图系统(包括电子形式),必须至少采用GCJ-...
  • yx0628
  • yx0628
  • 2013年07月30日 22:42
  • 5881

关于百度地图偏移的问题

首先看官方是怎么说的 /* 4.3 百度坐标为何有偏移? 国际经纬度坐标标准为WGS-84,国内必须至少使用国测局制定的GCJ-02,对地理位置进行首次加密。百度坐标在此基础上,进行了BD-09...
  • jjkliu
  • jjkliu
  • 2014年11月03日 18:11
  • 560

关于将geoserver gwc切片加载到地图上出现偏移的问题

将投影坐标系由EPSG:4326改为EPSG:900913  修改getBound函数 参考以下知识 一。EPSG:900913 GOOGLE MAP使用的投影为EPSG:900913 ...

天地图与谷歌的对比及偏移问题

问题来源 在天地图官网发现遥感图跟自己的标注图层对不上,因此开始怀疑有偏移问题。这个图上很明显看到两个图层的道路对不上。 但谷歌的底图跟天地图的标注结合的非常好,因此开始怀疑偏移问题。 ...

【高德地图API】如何解决坐标转换,坐标偏移?

摘要:各种坐标体系之间如何转换?到底有哪些坐标体系?什么是火星坐标?为什么我的坐标,在地图上显示会有偏移?本文详细解答以上问题。最后给出坐标拾取工具。 ---------------------...
  • huanzx
  • huanzx
  • 2017年11月02日 16:04
  • 38

google地图经纬度偏移修正算法完美解决方案

原文:http://blog.sina.com.cn/s/blog_65bd7eef0100hu5o.html google地图经纬度偏移修正算法完美解决方案  (2010-0...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:地图中的偏移问题的解决和源码(C#)
举报原因:
原因补充:

(最多只允许输入30个字)