[C#]利用纠偏数据来处理地球坐标(WGS-84)与火星坐标 (GCJ-02)转换

关键代码:

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using YanZhiwei.DotNet2.Utilities.Models;
namespace YanZhiwei.DotNet2.Utilities.Common
{
    /// <summary>
    /// 地图纠偏数据帮助类
    /// </summary>
    public class MapOffsetDataHelper
    {
        #region 构造函数以及变量
        private string offsetFullPath = string.Empty;
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="path">纠偏数据文件路径</param>
        public MapOffsetDataHelper(string path)
        {
            offsetFullPath = path;
        }
        #endregion
        #region 私有方法
        private void GetOffsetData(Action<MapCoord> mapCoordHanlder)
        {
            using (FileStream stream = new FileStream(offsetFullPath, FileMode.OpenOrCreate, FileAccess.Read))
            {
                using (BinaryReader reader = new BinaryReader(stream))
                {
                    int _size = (int)stream.Length / 8;
                    for (int i = 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>
        private MapCoord ToCoord(byte[] bytes)
        {
            //经度,纬度,x偏移量,y偏移量 【均两个字节】
            MapCoord _coord = new MapCoord();
            byte[] _b1 = new byte[2], _b2 = new byte[2], _b3 = new byte[2], _b4 = new byte[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>
        public List<MapCoord> GetMapCoordList()
        {
            List<MapCoord> _mapCoordList = new List<MapCoord>();
            GetOffsetData(c => _mapCoordList.Add(c));
            return _mapCoordList;
        }
        /// <summary>
        /// 获取纠偏数据集合
        /// </summary>
        /// <returns>纠偏数据集合</returns>
        public ArrayList GetMapCoordArrayList()
        {
            ArrayList _mapCoordArrayList = new ArrayList();
            GetOffsetData(c => _mapCoordArrayList.Add(c));
            return _mapCoordArrayList;
        }
        #endregion
    }
}

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }-----------------------------------------------------------------------------------------------

using System.Collections;
using YanZhiwei.DotNet2.Utilities.Models;
using YanZhiwei.DotNet2.Utilities.Tool;
namespace YanZhiwei.DotNet2.Utilities.Common
{
    /// <summary>
    /// 地图纠偏 帮助类
    /// </summary>
    public class MapOffsetHelper
    {
        /*
         *参考:
         *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 构造函数以及变量
        private ArrayList mapCoordArrayList;
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="offsetData">纠偏数据</param>
        public MapOffsetHelper(ArrayList offsetData)
        {
            mapCoordArrayList = offsetData;
        }
        #endregion
        #region 私有方法
        private MapCoord QueryOffSetData(LatLngPoint point)
        {
            MapCoord _search = new MapCoord();
            _search.Lat = (int)(point.LatY * 100);
            _search.Lon = (int)(point.LonX * 100);
            MapOffsetComparer rc = new MapOffsetComparer();
            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>
        public LatLngPoint 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);
            return new LatLngPoint(_lat, _lng);
        }
        #endregion
        #region 火星坐标转 (GCJ-02)地球坐标(WGS-84)
        /// <summary>
        /// 火星坐标转 (GCJ-02)地球坐标(WGS-84)
        /// </summary>
        /// <param name="gcjPoint">火星坐标转 (GCJ-02)</param>
        /// <returns>地球坐标(WGS-84)</returns>
        public LatLngPoint 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);
            return new LatLngPoint(_lat, _lng);
        }
        #endregion
    }
}

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

时间: 2024-10-11 00:49:12

[C#]利用纠偏数据来处理地球坐标(WGS-84)与火星坐标 (GCJ-02)转换的相关文章

地球坐标转高德的火星坐标

<?php class Point { private $longitude; private $latitude; private $x; private $y; public function setX( $x ) { $this->x = $x; } public function getX() { return $this->x; } public function setY( $y ) { $this->y = $y; } public function getY() {

[转]地球坐标 火星坐标 百度坐标 相互转换

在开始这个题目之前,先给大家再次扫扫盲,扫的不是坐标系统的盲,而是我们国家所使用的坐标系统.大家都知道,美国GPS使用的是WGS84的坐标系统,以经纬度的形式来表示地球平面上的某一个位置,这应该是国际共识.但在我国,出于国家安全考虑,国内所有导航电子地图必须使用国家测绘局制定的加密坐标系统,即将一个真实的经纬度坐标加密成一个不正确的经纬度坐标,我们在业内将前者称之为地球坐标,后者称之为火星坐标,具体的说明可以参看百度百科中关于火星坐标系统的解释. 1.国内各地图API坐标系统比较 参考http:

iOS 火星坐标相关整理及解决方案汇总(转)

这几天在处理定位相关的代码,彻彻底底的被火星坐标恶心到了. 恶心列表 从 CLLocationManager 取出来的经纬度放到 mapView 上显示,是错的! 从 CLLocationManager 取出来的经纬度去 Google Maps API 做逆地址解析,当然是错的! 从 MKMapView 取出来的经纬度去 Google Maps API 做逆地址解析终于对了.去百度地图API做逆地址解析,依旧是错的! 从上面两处取的经纬度放到百度地图上显示都是错的!错的!的! 当时我还不知道火星

百度坐标转火星坐标

下面是百度官方对百度坐标为何有偏移的解释:国际经纬度坐标标准为WGS-84,国内必须至少使用国测局制定的GCJ-02,对地理位置进行首次加密.百度坐标在此基础上,进行了BD-09二次加密措施,更加保护了个人隐私. 百度对外接口的坐标系并不是GPS采集的真实经纬度,需要通过坐标转换接口进行转换 API:坐标系 百度地图API:百度坐标 腾讯搜搜地图API:火星坐标 搜狐搜狗地图API:搜狗坐标* 阿里云地图API:火星坐标 图吧MapBar地图API:图吧坐标 高德MapABC地图API:火星坐标

利用 pacbio 数据组装真菌基因组

最近在做组装稻瘟病的基因组. 估计的基因组大小为40M. 由于没有参考基因组,进行de novo assembly. 用HGAP策略.需要的有用的pacbio数据量应为400M左右, 选用的seed read 最小长度为6K, seed的覆盖度应在20倍左右. 拼接流程为:1,filtering. 2, assembly. 3, mapping. 4, consensus.选用的cutoff如下图: 所有的操作都在网页上进行. piobio 的数据以cell 为单位.每个cell中有很多ZMWS

利用javascript和WebGL绘制地球 【翻译】

利用javascript和WebGL绘制地球 [翻译] 原翻译:利用javascript和WebGL绘制地球 [翻译] 在我们所有已知的HTML5API中,WebGL可能是最有意思的一个,利用这个API我们能够在浏览器中创造出炫酷3D场景的能力.本文将完整的向你展示一些炫酷是如何实现的. 需要特别指出的是,这篇教程我们将会构建一个地球行星模型,这个模型可以像一个兴奋的人一样环绕的旋转,另外,它可能使我们可以获得一些其他程序员的称赞,好吧,就这么多了. 准备 这篇教程我们将会用到一个令人着迷的We

利用RGB-D数据进行人体检测 带dataset

利用RGB-D数据进行人体检测 LucianoSpinello, Kai O. Arras 摘要 人体检测是机器人和智能系统中的重要问题.之前的研究工作使用摄像机和2D或3D测距器.本文中我们提出一种新的使用RGB-D的人体检测方法.我们从HOG( Histogram of OrientedGradients)描述子获得灵感,设计了一个在稠密深度数据中检测人体的方法,叫做深度方向直方图HOD(Histogram of Oriented Depths).HOD对局部深度变化的方向进行编码,依靠在预

Python 数据分析(二 本实验将学习利用 Python 数据聚合与分组运算,时间序列,金融与经济数据应用等相关知识

Python 数据分析(二) 本实验将学习利用 Python 数据聚合与分组运算,时间序列,金融与经济数据应用等相关知识 第1节 groupby 技术 第2节 数据聚合 第3节 分组级运算和转换 第4节 透视表和交叉表 第5节 时间序列 第6节 日期的规范.频率以及移动 第7节 时区处理 第8节 时期及算术运算 第9节 重采样及频率转换 第10节 时间序列绘图 groupby 技术 一.实验简介 Python 数据分析(二)需要同学们先行学完 Python 数据分析(一)的课程. 对数据集进行分

政府部门利用大数据面临的诸多难题

政府部门对大数据进行应用,不仅要处理多种来源和不同格式的数据集成等一般问题外,还面临着一些独特的挑战,最大的挑战是数据采集.由于政府部门收集的数据不仅从各种社交媒体.网站和众包中获取,还可以从不同的国家和机构中采集,收集难度就不难想象了.并且,国家之间的数据和信息共享是一个不小的问题,因为跨国共享信息牵涉到语言的转换和不同文化背景产生的交流问题,在这种情况下共享和传递信息可能会导致信息失去其原有的真实性.另外,在不同的政府部门和机构之间共享数据的状态也是一个挑战.比较政府数据与商业数据,最大的不