• 百度地图API(四)


    百度地图呈现

      前面工作已经完成,控件,方法等,这篇主要记录如何在WPF上呈现,还有坐标WGS-84转换为百度坐标的算法。

    WPF页面加载

      首先,要引用BaiduControl的项目,在window中引用

    1 xmlns:BaiduMapControl="clr-namespace:BaiduMapControl;assembly=BaiduMapControl"

      在Grid中声明,命名为bmcBaiduMap,在控件上面,还加了一个隐藏的控件,是一个加载等待控件,因为百度地图API是一Web,无法在其上添加加载控件,所以就先定义了一个加载控件,设置为隐藏,加载的时候显示,加载完成隐藏。

    1 <Grid>
    2                                 <controls:WaitLoading x:Name="LoadingControl"
    3                                                       Visibility="Collapsed" />
    4                                 <BaiduMapControl:BaiduMap x:Name="bmcBaiduMap"
    5                                                           Visibility="Visible"
    6                                                           Opacity="0.5"
    7                                                           Margin="0,0,0,0" />
    8                             </Grid>

    地图上的操作

      这里只写了一部分的操作,不过大体一致。

      地图上加载一个UserMarker

    1 UserMarker um = new UserMarker(selectedUser.UserName);
    2 bmcBaiduMap.SelectedUserMarker(um);

      地图上加载路线

    1 List<BaiduMapControl.MapBase.Point> pointList = new List<BaiduMapControl.MapBase.Point>();
    2 //赋值
    3 BaiduMapControl.MapService.UserRoute userRoute = new BaiduMapControl.MapService.UserRoute(pointList);
    4 bmcBaiduMap.AddUserRoute(userRoute);

      清空所有覆盖物

    1 BaiduMapControl.MapBase.MapControl mc = new BaiduMapControl.MapBase.MapControl();
    2 bmcBaiduMap.ClearAllOverlay(mc);

      地图中心移动到某坐标

    1 BaiduMapControl.MapBase.MapControl mc = new BaiduMapControl.MapBase.MapControl(lastPosition.Lng, lastPosition.Lat, mapSize);
    2 bmcBaiduMap.MoveMapTo(mc);

    坐标转换算法

      分了两部,第一步是将WGS-84(地球坐标系)转为GCJ-02(火星坐标系),第二部才是GCJ-02转为BD-09(百度坐标系)(好像百度地图官方有直接将WGS-84转为百度坐标系的接口,可以自行查找)

      地球坐标系 (WGS-84) 到火星坐标系 (GCJ-02) 的转换算法

     1 #region  地球坐标系 (WGS-84) 到火星坐标系 (GCJ-02) 的转换算法
     2 
     3         const double pi = 3.14159265358979324;
     4         //
     5         // Krasovsky 1940
     6         //
     7         // a = 6378245.0, 1/f = 298.3
     8         // b = a * (1 - f)
     9         // ee = (a^2 - b^2) / a^2;
    10         const double a = 6378245.0;
    11         const double ee = 0.00669342162296594323;
    12 
    13         /// <summary>
    14         ///  World Geodetic System ==> Mars Geodetic System(GPS左边转换火星坐标)
    15         /// </summary>
    16         /// <param name="wgLat"></param>
    17         /// <param name="wgLon"></param>
    18         /// <param name="mgLat"></param>
    19         /// <param name="mgLon"></param>
    20         public static List<string> TransformGPSToBMap(double wgLat, double wgLon)
    21         {
    22             List<string> croods = new List<string>();
    23             double mgLat;
    24             double mgLon;
    25             if (outOfChina(wgLat, wgLon))
    26             {
    27                 mgLat = wgLat;
    28                 mgLon = wgLon;
    29                 return bd_encrypt(mgLat,mgLon);
    30             }
    31 
    32             double dLat = transformLat(wgLon - 105.0, wgLat - 35.0);
    33             double dLon = transformLon(wgLon - 105.0, wgLat - 35.0);
    34             double radLat = wgLat / 180.0 * pi;
    35             double magic = Math.Sin(radLat);
    36             magic = 1 - ee * magic * magic;
    37             double sqrtMagic = Math.Sqrt(magic);
    38             dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);
    39             dLon = (dLon * 180.0) / (a / sqrtMagic * Math.Cos(radLat) * pi);
    40             mgLat = wgLat + dLat;
    41             mgLon = wgLon + dLon;
    42 
    43             return bd_encrypt(mgLat, mgLon);
    44         }
    45 
    46         /// <summary>
    47         /// 坐标是否出中国地区
    48         /// </summary>
    49         /// <param name="lat"></param>
    50         /// <param name="lon"></param>
    51         /// <returns></returns>
    52         static bool outOfChina(double lat, double lon)
    53         {
    54             if (lon < 72.004 || lon > 137.8347)
    55                 return true;
    56             if (lat < 0.8293 || lat > 55.8271)
    57                 return true;
    58             return false;
    59         }
    60 
    61         /// <summary>
    62         /// 转换纬度
    63         /// </summary>
    64         /// <param name="x"></param>
    65         /// <param name="y"></param>
    66         /// <returns></returns>
    67         static double transformLat(double x, double y)
    68         {
    69             double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.Sqrt(Math.Abs(x));
    70             ret += (20.0 * Math.Sin(6.0 * x * pi) + 20.0 * Math.Sin(2.0 * x * pi)) * 2.0 / 3.0;
    71             ret += (20.0 * Math.Sin(y * pi) + 40.0 * Math.Sin(y / 3.0 * pi)) * 2.0 / 3.0;
    72             ret += (160.0 * Math.Sin(y / 12.0 * pi) + 320 * Math.Sin(y * pi / 30.0)) * 2.0 / 3.0;
    73             return ret;
    74         }
    75 
    76         /// <summary>
    77         /// 转换经度
    78         /// </summary>
    79         /// <param name="x"></param>
    80         /// <param name="y"></param>
    81         /// <returns></returns>
    82         static double transformLon(double x, double y)
    83         {
    84             double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.Sqrt(Math.Abs(x));
    85             ret += (20.0 * Math.Sin(6.0 * x * pi) + 20.0 * Math.Sin(2.0 * x * pi)) * 2.0 / 3.0;
    86             ret += (20.0 * Math.Sin(x * pi) + 40.0 * Math.Sin(x / 3.0 * pi)) * 2.0 / 3.0;
    87             ret += (150.0 * Math.Sin(x / 12.0 * pi) + 300.0 * Math.Sin(x / 30.0 * pi)) * 2.0 / 3.0;
    88             return ret;
    89         }
    90 
    91         #endregion
    View Code

      火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法

     1 #region 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法
     2 
     3         const double x_pi = 3.14159265358979324 * 3000.0 / 180.0;
     4 
     5         /// <summary>
     6         /// 将 GCJ-02(google地图) 坐标转换成 BD-09(百度地图) 坐标
     7         /// </summary>
     8         /// <param name="gg_lat"></param>
     9         /// <param name="gg_lon"></param>
    10         /// <returns></returns>
    11         public static List<string> bd_encrypt(double gg_lat, double gg_lon)
    12         {
    13             double bd_lat;
    14             double bd_lon;
    15             double x = gg_lon, y = gg_lat;
    16             double z = Math.Sqrt(x * x + y * y) + 0.00002 * Math.Sin(y * x_pi);
    17             double theta = Math.Atan2(y, x) + 0.000003 * Math.Cos(x * x_pi);
    18             bd_lon = z * Math.Cos(theta) + 0.0065;
    19             bd_lat = z * Math.Sin(theta) + 0.006;
    20             return new List<string>() { bd_lon.ToString(), bd_lat .ToString()};
    21         }
    22 
    23         /// <summary>
    24         /// 将 BD-09 坐标转换成  GCJ-02  坐标
    25         /// </summary>
    26         /// <param name="bd_lat"></param>
    27         /// <param name="bd_lon"></param>
    28         /// <param name="gg_lat"></param>
    29         /// <param name="gg_lon"></param>
    30         void bd_decrypt(double bd_lat, double bd_lon, double gg_lat, double gg_lon)
    31         {
    32             double x = bd_lon - 0.0065, y = bd_lat - 0.006;
    33             double z = Math.Sqrt(x * x + y * y) - 0.00002 * Math.Sin(y * x_pi);
    34             double theta = Math.Atan2(y, x) - 0.000003 * Math.Cos(x * x_pi);
    35             gg_lon = z * Math.Cos(theta);
    36             gg_lat = z * Math.Sin(theta);
    37         }
    38 
    39         #endregion
    View Code

    结束语

      百度地图API的使用到这就over,可能有些地方语言和代码都不太清晰,语文体育老师教的,体育课都是被英语老师占~其中也参考了好多大牛的文章,现在已经找不到了,对不住他们呀~以下是百度官方网址。

      百度地图官方网址:http://developer.baidu.com/map/reference/index.php

      百度API实例网址:http://developer.baidu.com/map/jsdemo.htm#h0_6

  • 相关阅读:
    T-SQL---多值模糊查询的处理
    SQL Server 并行操作优化,避免并行操作被抑制而影响SQL的执行效率
    SQL Server创建复合索引时,复合索引列顺序对查询的性能影响
    Sql Server 聚集索引扫描 Scan Direction的两种方式------FORWARD 和 BACKWARD
    Sql Server 内存相关计数器以及内存压力诊断
    通过手动创建统计信息优化sql查询性能案例
    对聚集表查询的时候,未显式指定排序列的时候,默认查询结果的顺序一定是按照聚集索引顺序排序的吗
    Buffer cache hit ratio性能计数器真的可以作为SQL Server 内存瓶颈的判断指标吗?
    sqlserver 存储过程中使用临时表到底会不会导致重编译
    权限 位运算
  • 原文地址:https://www.cnblogs.com/shadow-fei/p/4683393.html
Copyright © 2020-2023  润新知