关键代码:
usingSystem;usingSystem.Collections;usingSystem.Collections.Generic;usingSystem.IO;usingYanZhiwei.DotNet2.Utilities.Models;namespaceYanZhiwei.DotNet2.Utilities.Common
{/// <summary>/// 地图纠偏数据帮助类/// </summary>publicclassMapOffsetDataHelper
{#region构造函数以及变量PRivatestringoffsetFullPath =string.Empty;/// <summary>/// 构造函数/// </summary>/// <param name="path">纠偏数据文件路径</param>publicMapOffsetDataHelper(stringpath)
{
offsetFullPath = path;
}#endregion#region私有方法privatevoidGetOffsetData(Action<MapCoord> mapCoordHanlder)
{using(FileStream stream =newFileStream(offsetFullPath, FileMode.OpenOrCreate, Fileaccess.Read))
{using(BinaryReader reader =newBinaryReader(stream))
{int_size = (int)stream.Length / 8;for(inti = 0; i < _size; i++)
{byte[] _source = reader.ReadBytes(8);
MapCoord _coord = ToCoord(_source);
mapCoordHanlder(_coord);
}
}
}
}/// <summary>/// 将字节转化为具体的数据对象/// </summary>/// <param name="bytes">bytes</param>/// <returns>MapCoord</returns>privateMapCoord ToCoord(byte[] bytes)
{//经度,纬度,x偏移量,y偏移量 【均两个字节】MapCoord _coord =newMapCoord();byte[] _b1 =newbyte[2], _b2 =newbyte[2], _b3 =newbyte[2], _b4 =newbyte[2];
Array.Copy(bytes, 0, _b1, 0, 2);
Array.Copy(bytes, 2, _b2, 0, 2);
Array.Copy(bytes, 4, _b3, 0, 2);
Array.Copy(bytes, 6, _b4, 0, 2);
_coord.Lon = BitConverter.ToInt16(_b1, 0);
_coord.Lat = BitConverter.ToInt16(_b2, 0);
_coord.X_off = BitConverter.ToInt16(_b3, 0);
_coord.Y_off = BitConverter.ToInt16(_b4, 0);return_coord;
}#endregion#region获取纠偏数据集合/// <summary>/// 获取纠偏数据集合/// </summary>/// <returns>纠偏数据集合</returns>publicList<MapCoord> GetMapCoordList()
{
List<MapCoord> _mapCoordList =newList<MapCoord>();
GetOffsetData(c => _mapCoordList.Add(c));return_mapCoordList;
}/// <summary>/// 获取纠偏数据集合/// </summary>/// <returns>纠偏数据集合</returns>publicArrayList GetMapCoordArrayList()
{
ArrayList _mapCoordArrayList =newArrayList();
GetOffsetData(c => _mapCoordArrayList.Add(c));return_mapCoordArrayList;
}#endregion}
}
-----------------------------------------------------------------------------------------------
usingSystem.Collections;usingYanZhiwei.DotNet2.Utilities.Models;usingYanZhiwei.DotNet2.Utilities.Tool;namespaceYanZhiwei.DotNet2.Utilities.Common
{/// <summary>/// 地图纠偏 帮助类/// </summary>publicclassMapOffsetHelper
{/**参考:*1.http://www.apkbus.com/forum.php?mod=viewthread&tid=137621&extra=page%3D1&page=1*2.http://yanue.net/post-122.html*3.http://go2log.com/2011/08/30/%E4%B8%AD%E5%9B%BD%E5%9C%B0%E5%9B%BE%E5%81%8F%E7%A7%BB%E6%A0%A1%E6%AD%A3php%E7%AE%97%E6%B3%95/*4.http://www.devdiv.com/ios_gps_google_-blog-60266-10835.html*/#region构造函数以及变量privateArrayList mapCoordArrayList;/// <summary>/// 构造函数/// </summary>/// <param name="offsetData">纠偏数据</param>publicMapOffsetHelper(ArrayList offsetData)
{
mapCoordArrayList = offsetData;
}#endregion#region私有方法privateMapCoord QueryOffSetData(LatLngPoint point)
{
MapCoord _search =newMapCoord();
_search.Lat = (int)(point.LatY * 100);
_search.Lon = (int)(point.LonX * 100);
MapOffsetComparer rc =newMapOffsetComparer();int_findedIndex = mapCoordArrayList.BinarySearch(0, mapCoordArrayList.Count, _search, rc);
MapCoord _findedCoord = (MapCoord)mapCoordArrayList[_findedIndex];return_findedCoord;
}#endregion#region地球坐标(WGS-84)转火星坐标 (GCJ-02)/// <summary>/// 地球坐标(WGS-84)转火星坐标 (GCJ-02)/// </summary>/// <param name="wgsPoint">地球坐标(WGS-84)</param>/// <returns>火星坐标 (GCJ-02)</returns>publicLatLngPoint WGS84ToGCJ02(LatLngPoint wgsPoint)
{
MapCoord _findedCoord = QueryOffSetData(wgsPoint);double_pixY = MapHelper.LatToPixel(wgsPoint.LatY, 18);double_pixX = MapHelper.LonToPixel(wgsPoint.LonX, 18);
_pixY += _findedCoord.Y_off;
_pixX += _findedCoord.X_off;double_lat = MapHelper.PixelToLat(_pixY, 18);double_lng = MapHelper.PixelToLon(_pixX, 18);returnnewLatLngPoint(_lat, _lng);
}#endregion#region火星坐标转 (GCJ-02)地球坐标(WGS-84)/// <summary>/// 火星坐标转 (GCJ-02)地球坐标(WGS-84)/// </summary>/// <param name="gcjPoint">火星坐标转 (GCJ-02)</param>/// <returns>地球坐标(WGS-84)</returns>publicLatLngPoint GCJ02ToWGS84(LatLngPoint gcjPoint)
{
MapCoord _findedCoord = QueryOffSetData(gcjPoint);double_pixY = MapHelper.LatToPixel(gcjPoint.LatY, 18);double_pixX = MapHelper.LonToPixel(gcjPoint.LonX, 18);
_pixY -= _findedCoord.Y_off;
_pixX -= _findedCoord.X_off;double_lat = MapHelper.PixelToLat(_pixY, 18);double_lng = MapHelper.PixelToLon(_pixX, 18);returnnewLatLngPoint(_lat, _lng);
}#endregion}
}