1 using System;
2 using System.Data;
3 using System.Configuration;
4 using System.Linq;
5 using System.Web;
6 using System.Web.Security;
7 using System.Web.UI;
8 using System.Web.UI.HtmlControls;
9 using System.Web.UI.WebControls;
10 using System.Web.UI.WebControls.WebParts;
11 using System.Xml.Linq;
12
13 namespace GeoSite
14 {
15 /// <summary>
16 /// Geo辅助类
17 /// </summary>
18 public static class GeoHelper
19 {
20 /// <summary>
21 /// 根据两点的经纬度计算两点距离
22 /// 可参考:通过经纬度计算距离的公式 http://www.storyday.com/html/y2009/2212_according-to-latitude-and-longitude-distance-calculation-formula.html
23 /// </summary>
24 /// <param name="src">A点维度</param>
25 /// <param name="dest">B点经度</param>
26 /// <returns></returns>
27 public static double GetDistance(LatLon src, LatLon dest)
28 {
29 if (Math.Abs(src.Lat) > 90 || Math.Abs(dest.Lat) > 90 || Math.Abs(src.Lon) > 180 || Math.Abs(dest.Lon) > 180)
30 throw new ArgumentException("经纬度信息不正确!");
31
32 double latDis = src.RadLat - dest.RadLat;
33 double lonDis = src.RadLon - dest.RadLon;
34
35 double s = 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(latDis / 2), 2) + Math.Cos(src.Lat) * Math.Cos(dest.Lat) * Math.Pow(Math.Sin(lonDis / 2), 2)));
36 s = s * LatLon.EARTH_RADIUS / 1000;
37 s = Math.Round(s * 10000) / 10000;
38
39 return s;
40 }
41
42 /// <summary>
43 /// 根据两点的经纬度计算两点距离
44 /// 可参考:通过经纬度计算距离的公式 http://www.storyday.com/html/y2009/2212_according-to-latitude-and-longitude-distance-calculation-formula.html
45 /// </summary>
46 /// <param name="lat1">A点维度</param>
47 /// <param name="lon1">A点经度</param>
48 /// <param name="lat2">B点维度</param>
49 /// <param name="lon2">B点经度</param>
50 /// <returns></returns>
51 public static double GetDistance(double lat1, double lon1, double lat2, double lon2)
52 {
53 LatLon src = new LatLon(lat1, lon1);
54 LatLon dest = new LatLon(lat2, lon2);
55 return GetDistance(src, dest);
56 }
57
58
59 /// <summary>
60 /// 已知点A经纬度,根据B点据A点的距离,和方位,求B点的经纬度
61 /// </summary>
62 /// <param name="a">已知点A</param>
63 /// <param name="distance">B点到A点的距离 </param>
64 /// <param name="angle">B点相对于A点的方位,12点钟方向为零度,角度顺时针增加</param>
65 /// <returns>B点的经纬度坐标</returns>
66 public static LatLon GetLatLon(LatLon a, double distance, double angle)
67 {
68 double dx = distance * 1000 * Math.Sin(angle * Math.PI / 180);
69 double dy = distance * 1000 * Math.Cos(angle * Math.PI / 180);
70
71 double lon = (dx / a.Ed + a.RadLon) * 180 / Math.PI;
72 double lat = (dy / a.Ec + a.RadLat) * 180 / Math.PI;
73
74 LatLon b = new LatLon(lat, lon);
75 return b;
76 }
77
78 /// <summary>
79 /// 已知点A经纬度,根据B点据A点的距离,和方位,求B点的经纬度
80 /// </summary>
81 /// <param name="longitude">已知点A经度</param>
82 /// <param name="latitude">已知点A纬度</param>
83 /// <param name="distance">B点到A点的距离</param>
84 /// <param name="angle">B点相对于A点的方位,12点钟方向为零度,角度顺时针增加</param>
85 /// <returns>B点的经纬度坐标</returns>
86 public static LatLon GetLatLon(double longitude, double latitude, double distance, double angle)
87 {
88 LatLon a = new LatLon(latitude, longitude);
89 return GetLatLon(a, distance, angle);
90 }
91 }
92 }
93