百度地图操作源码

项目描述:

基于百度地图api建立的地图定位,移动,搜索,与计算等功能.
详细功能包括:
地图过2秒移动中心点
地图控件创建
添加标注
添加折线
事件
涂层
地图标注
步行路线导航
步行路线覆折线
3D地图切换
经纬度查询
地图查询
邀请好友
三维地图导航
自定义标注与百度地址实现导航
2D和3D地图切换并实现导航
百度查询接口耗时

本内容的关键代码:

using System;
using System.Collections.Generic;
using System.Text;

namespace Iaspec.GIS.Common
{
    public abstract class GaussPrjBase: ICoordinate
    {        
        protected int zone_wide = 6;
        protected double semi_major;		    // major axis
        protected double semi_minor;		    // minor axis
        protected double scale_factor = 1.0;    // scale factor
        protected double central_meridian;      //Center longitude (projection center)
        protected double lat_origin = 0;	    //center latitude
        protected double e0, e1, e2, e3, e, es, esp;	// eccentricity constants
        protected double ml0;		            //small value m
        protected double false_northing = 0.0;  //y offset in meters
        protected double false_easting;	        //x offset in meters

        #region ICoordinate Members
        public int ZoneWide
        {
            get { return zone_wide; }
            set { zone_wide = value; } 
        }

        public void DD2DMS(double DecimalDegree, out int Degree, out int Minute, out double Second)
        {
            Degree = (int)DecimalDegree;
            Minute = (int)((DecimalDegree - Degree) * 60.0);
            Second = Math.Round((DecimalDegree * 60 - Degree * 60 - Minute) * 60 * 100) / 100.0;
        
        }

        //public double DistanceOfTwoPoints(double lng1, double lat1, double lng2, double lat2, GaussSphere gs)
        //{
        //    double radLat1 = Degrees2Radians(lat1);
        //    double radLat2 = Degrees2Radians(lat2);
        //    double a = radLat1 - radLat2;
        //    double b = Degrees2Radians(lng1) - Degrees2Radians(lng2);
        //    double s = 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(a / 2), 2) +
        //    Math.Cos(radLat1) * Math.Cos(radLat2) * Math.Pow(Math.Sin(b / 2), 2)));
        //    s = s * (gs == GaussSphere.WGS84 ? 6378137.0 : (gs == GaussSphere.Xian80 ? 6378140.0 : 6378245.0));
        //    s = Math.Round(s * 10000) / 10000;
        //    return s;
        //}
        
        protected static double Degrees2Radians(double deg)
        {
            return (Math.PI / 180 * deg);

        }
       
		protected static double Radians2Degrees(double rad)
		{
            return (180 / Math.PI * rad);
		}

        public void DMS2DD(int Degree, int Minute, double Second, out double DecimalDegree)
        {
            DecimalDegree = Degree + Minute / 60.0 + Second / 60.0 / 60.0;
        }


        public void GaussPrjCalculate(double longitude, double latitude, out double X, out double Y)
        {
            double lon = Degrees2Radians(longitude);
            double lat = Degrees2Radians(latitude);

            double delta_lon = 0.0;	        //Delta longitude (Given longitude - center
            double sin_phi, cos_phi;        //sin and cos value
            double al, als;		            //temporary values
            double c, t, tq;	            //temporary values
            double con, n, ml;	            //cone constant, small m

            es = 1.0 - Math.Pow(semi_minor / semi_major, 2);
            e = Math.Sqrt(es);
            e0 = (1.0 - 0.25 * es * (1.0 + es / 16.0 * (3.0 + 1.25 * es)));
            e1 = (0.375 * es * (1.0 + 0.25 * es * (1.0 + 0.46875 * es)));
            e2 = (0.05859375 * es * es * (1.0 + 0.75 * es));
            e3 = (es * es * es * (35.0 / 3072.0));
            ml0 = semi_major * (e0 * lat_origin - e1 * Math.Sin(2.0 * lat_origin) + e2 * Math.Sin(4.0 * lat_origin) - e3 * Math.Sin(6.0 * lat_origin));
            esp = es / (1.0 - es);

            int projNo = (int)(longitude / zone_wide);
            central_meridian = Degrees2Radians(projNo*zone_wide+zone_wide/2);
            false_easting = 1000000L * (projNo + 1) + 500000L;

            delta_lon = Adjust_lon(lon - central_meridian);
            sin_phi = Math.Sin(lat);
            cos_phi = Math.Cos(lat);

            al = cos_phi * delta_lon;
            als = Math.Pow(al, 2);
            c = esp * Math.Pow(cos_phi, 2);
            tq = Math.Tan(lat);
            t = Math.Pow(tq, 2);
            con = 1.0 - es * Math.Pow(sin_phi, 2);
            n = semi_major / Math.Sqrt(con);
            ml = semi_major * (e0 * lat  - e1 * Math.Sin(2.0 * lat) + e2 * Math.Sin(4.0 * lat) - e3 * Math.Sin(6.0 * lat));
            

            X = scale_factor * n * al * (1.0 + als / 6.0 * (1.0 - t + c + als / 20.0 *
                (5.0 - 18.0 * t + Math.Pow(t, 2) + 72.0 * c - 58.0 * esp))) + false_easting;
            Y = scale_factor * (ml - ml0 + n * tq * (als * (0.5 + als / 24.0 *
                (5.0 - t + 9.0 * c + 4.0 * Math.Pow(c, 2) + als / 30.0 * (61.0 - 58.0 * t
                + Math.Pow(t, 2) + 600.0 * c - 330.0 * esp))))) + false_northing;
        }

        public void GaussPrjInvCalculate(double X, double Y, out double longitude, out double latitude)
        {
            double con, phi;		            //temporary angles
            double delta_phi;	                //difference between longitudes
            long i;			                    //counter variable
            double sin_phi, cos_phi, tan_phi;	//sin cos and tangent values
            double c, cs, t, ts, n, r, d, ds;	//temporary variables
            long max_iter = 6;			        //maximun number of iterations

            es = 1.0 - Math.Pow(semi_minor / semi_major, 2);
            e = Math.Sqrt(es);
            e0 = (1.0 - 0.25 * es * (1.0 + es / 16.0 * (3.0 + 1.25 * es)));
            e1 = (0.375 * es * (1.0 + 0.25 * es * (1.0 + 0.46875 * es)));
            e2 = (0.05859375 * es * es * (1.0 + 0.75 * es));
            e3 = (es * es * es * (35.0 / 3072.0));
            ml0 = semi_major * (e0 * lat_origin - e1 * Math.Sin(2.0 * lat_origin) + e2 * Math.Sin(4.0 * lat_origin) - e3 * Math.Sin(6.0 * lat_origin));
            esp = es / (1.0 - es);

            int projNo = (int)(X / 1000000L);
            central_meridian = Degrees2Radians(projNo * zone_wide + zone_wide / 2);
            false_easting = 1000000L * (projNo + 1) + 500000L;

            double x = X - false_easting;
            double y = Y - false_northing;

            con = (ml0 + y / scale_factor) / semi_major;
            phi = con;
            for (i = 0; ; i++)
            {
                delta_phi = ((con + e1 * Math.Sin(2.0 * phi) - e2 * Math.Sin(4.0 * phi) + e3 * Math.Sin(6.0 * phi))
                    / e0) - phi;
                phi += delta_phi;
                if (Math.Abs(delta_phi) <= 1.0e-10) break;
                if (i >= max_iter)
                    throw new ApplicationException("Latitude failed to converge");
            }
            if (Math.Abs(phi) < Math.PI/2.0)
            {
                sin_phi = Math.Sin(phi);
                cos_phi = Math.Cos(phi);
                tan_phi = Math.Tan(phi);
                c = esp * Math.Pow(cos_phi, 2);
                cs = Math.Pow(c, 2);
                t = Math.Pow(tan_phi, 2);
                ts = Math.Pow(t, 2);
                con = 1.0 - es * Math.Pow(sin_phi, 2);
                n = semi_major / Math.Sqrt(con);
                r = n * (1.0 - es) / con;
                d = x / (n * scale_factor);
                ds = Math.Pow(d, 2);

                double lat = phi - (n * tan_phi * ds / r) * (0.5 - ds / 24.0 * (5.0 + 3.0 * t +
                    10.0 * c - 4.0 * cs - 9.0 * esp - ds / 30.0 * (61.0 + 90.0 * t +
                    298.0 * c + 45.0 * ts - 252.0 * esp - 3.0 * cs)));
                double lon = Adjust_lon(central_meridian + (d * (1.0 - ds / 6.0 * (1.0 + 2.0 * t +
                    c - ds / 20.0 * (5.0 - 2.0 * c + 28.0 * t - 3.0 * cs + 8.0 * esp +
                    24.0 * ts))) / cos_phi));
                longitude = Radians2Degrees(lon);
                latitude = Radians2Degrees(lat);
            }
            else
            {
                longitude = Radians2Degrees(Math.PI / 2 * (y < 0.0 ? -1 : 1));
                latitude = Radians2Degrees(central_meridian);
            }
		
        }

        private double Adjust_lon(double x)
        {
            long count = 0;
            double prjMAXLONG = 2147483647;
            double DBLLONG = 4.61168601e18;
            for (; ; )
            {
                if (Math.Abs(x) <= Math.PI)
                {
                    break;
                }
                else
                {
                    if (((long)Math.Abs(x / Math.PI)) < 2)
                        x = x - ((x < 0.0 ? -1 : 1) * Math.PI * 2.0);
                    else
                        if (((long)Math.Abs(x / Math.PI * 2.0)) < prjMAXLONG)
                        {
                            x = x - (((long)(x / Math.PI * 2.0)) * Math.PI * 2.0);
                        }
                        else
                        {
                            if (((long)Math.Abs(x / (prjMAXLONG * Math.PI * 2.0))) < prjMAXLONG)
                            {
                                x = x - (((long)(x / (prjMAXLONG * Math.PI * 2.0))) * (Math.PI * 2.0 * prjMAXLONG));
                            }
                            else
                            {
                                if (((long)Math.Abs(x / (DBLLONG * Math.PI * 2.0))) < prjMAXLONG)
                                {
                                    x = x - (((long)(x / (DBLLONG * Math.PI * 2.0))) * (Math.PI * 2.0 * DBLLONG));
                                }
                                else
                                {
                                    x = x - ((x < 0.0 ? -1 : 1) * Math.PI * 2.0);
                                }
                            }
                        }
                    count++;
                    if (count > 4) break;
                }
            }
            return (x);
        }

        #endregion

        
    }

    /// <summary>
    /// 高斯投影选用的参考椭球
    /// </summary>
    public enum Spheroid
    {
        Xian80,
        Beijing54,
        WGS84,
    }
}


本项目原作者:张虔

项目源代码来自1:http://download.csdn.net/detail/lovegonghui/8986457

项目源代码来自2:http://down.51cto.com/data/2081371

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值