- 下载地址
下载地址https://download.csdn.net/download/qq_17371831/48961706
https://download.csdn.net/download/qq_17371831/48961706
- 其他类源码
public class PointLatLngComparer : IEqualityComparer<PointLatLng>{public bool Equals(PointLatLng x, PointLatLng y){return x.Lat == y.Lat && x.Lng == y.Lng;}public int GetHashCode(PointLatLng obj){return string.Format("{0},{1}", obj.Lng, obj.Lat).GetHashCode();}}
public class GeometryUtil{private const double EARTH_RADIUS = 6378.137;//地球半径/// <summary>/// 获取多边形几何中心点/// </summary>/// <param name="mapPolygon"></param>/// <returns></returns>public static PointLatLng GetCenterPoint(GMapPolygon mapPolygon){if (mapPolygon == null){return new PointLatLng();}List<GeoAPI.Geometries.Coordinate> coordinates = new List<GeoAPI.Geometries.Coordinate>();foreach (var value in mapPolygon.Points){GeoAPI.Geometries.Coordinate coordinate = new GeoAPI.Geometries.Coordinate(value.Lng, value.Lat);coordinates.Add(coordinate);}if (mapPolygon.Points.Count == 2){NetTopologySuite.Geometries.LineString lineString = new NetTopologySuite.Geometries.LineString(coordinates.ToArray());IPoint point = lineString.Centroid;return new PointLatLng(point.Y, point.X);}else{if (mapPolygon.Points[0].Lng != mapPolygon.Points[mapPolygon.Points.Count - 1].Lng ||mapPolygon.Points[0].Lat != mapPolygon.Points[mapPolygon.Points.Count - 1].Lat){coordinates.Add(new GeoAPI.Geometries.Coordinate(mapPolygon.Points[0].Lng, mapPolygon.Points[0].Lat));}NetTopologySuite.Geometries.LinearRing linearRing = new NetTopologySuite.Geometries.LinearRing(coordinates.ToArray());NetTopologySuite.Geometries.Polygon polygon = new NetTopologySuite.Geometries.Polygon(linearRing);IPoint point = polygon.Centroid;return new PointLatLng(point.Y, point.X);}}public static List<Coordinate> WGS84ToWebMercator(List<PointLatLng> pointLatLngs){if (pointLatLngs == null)return null;IList<Coordinate> coors = PointsToCoords(pointLatLngs);NetTopologySuite.Geometries.PrecisionModel precisionModel = new NetTopologySuite.Geometries.PrecisionModel(GeoAPI.Geometries.PrecisionModels.Floating);GeoAPI.CoordinateSystems.ICoordinateSystem wgs84 = ProjNet.CoordinateSystems.GeographicCoordinateSystem.WGS84;GeoAPI.CoordinateSystems.ICoordinateSystem webMercator = ProjNet.CoordinateSystems.ProjectedCoordinateSystem.WebMercator;int SRID_wgs84 = Convert.ToInt32(wgs84.AuthorityCode); //WGS84 SRIDint SRID_webMercator = Convert.ToInt32(webMercator.AuthorityCode); //WebMercator SRIDProjNet.CoordinateSystems.Transformations.CoordinateTransformationFactory ctFact = new ProjNet.CoordinateSystems.Transformations.CoordinateTransformationFactory();GeoAPI.CoordinateSystems.Transformations.ICoordinateTransformation transformation = ctFact.CreateFromCoordinateSystems(wgs84, webMercator);NetTopologySuite.Geometries.GeometryFactory factory_wgs84 = new NetTopologySuite.Geometries.GeometryFactory(precisionModel, SRID_wgs84);IList<Coordinate> coords = transformation.MathTransform.TransformList(coors);//var gcgs2000 = CreateCoordinateSystemFromWkt("GEOGCS[\"China Geodetic Coordinate System 2000\",DATUM[\"China_2000\",SPHEROID[\"CGCS2000\",6378137,298.257222101,AUTHORITY[\"EPSG\",\"1024\"]],AUTHORITY[\"EPSG\",\"1043\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4490\"]]");//var gcgs4508 = CreateCoordinateSystemFromWkt("PROJCS[\"CGCS2000 / Gauss-Kruger CM 111E\",GEOGCS[\"China Geodetic Coordinate System 2000\",DATUM[\"China_2000\",SPHEROID[\"CGCS2000\",6378137,298.257222101,AUTHORITY[\"EPSG\",\"1024\"]],AUTHORITY[\"EPSG\",\"1043\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4490\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",111],PARAMETER[\"scale_factor\",1],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",0],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AUTHORITY[\"EPSG\",\"4508\"]]");//IList<Coordinate> temps = ConvertCoordinates(coors.ToList(), gcgs2000,gcgs4508);//IList<Coordinate> temps1= ConvertCoordinates(temps.ToList(), gcgs4508,gcgs2000);return coords.ToList();}public static List<PointLatLng> WGS84ToWebMercator2(List<PointLatLng> pointLatLngs){List<Coordinate> temps = WGS84ToWebMercator(pointLatLngs);List<PointLatLng> points = CoordsToPoints(temps);return points;}public static List<PointLatLng> WebMercatorToWGS84(List<PointLatLng> pointLatLngs){return ConvertCoordinates(pointLatLngs, ProjNet.CoordinateSystems.ProjectedCoordinateSystem.WebMercator, ProjNet.CoordinateSystems.GeographicCoordinateSystem.WGS84);}public static List<PointLatLng> CoordsToPoints(List<Coordinate> coords){List<PointLatLng> points = new List<PointLatLng>();foreach (var entity in coords){points.Add(new PointLatLng(entity.Y, entity.X));}return points;}public static List<Coordinate> PointsToCoords(List<PointLatLng> points){List<Coordinate> coords = new List<Coordinate>();foreach(var entity in points){coords.Add(new Coordinate(entity.Lng, entity.Lat));}return coords;}/// <summary>/// 默认创建EPSG:4490 国家2000大地坐标系/// </summary>/// <param name="wkt"></param>/// <returns></returns>public static GeoAPI.CoordinateSystems.ICoordinateSystem CreateCoordinateSystemFromWkt(string wkt){if (string.IsNullOrEmpty(wkt))wkt = "GEOGCS[\"China Geodetic Coordinate System 2000\",DATUM[\"China_2000\",SPHEROID[\"CGCS2000\",6378137,298.257222101,AUTHORITY[\"EPSG\",\"1024\"]],AUTHORITY[\"EPSG\",\"1043\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4490\"]]";try{ICoordinateSystemFactory coordinateSystemFactory = new ProjNet.CoordinateSystems.CoordinateSystemFactory();GeoAPI.CoordinateSystems.ICoordinateSystem coordinateSystem = coordinateSystemFactory.CreateFromWkt(wkt);return coordinateSystem;}catch{return null;}}public static List<Coordinate> ConvertCoordinates(List<Coordinate> coordinates, ICoordinateSystem sourceCoordinateSystem, ICoordinateSystem targetCoordinateSystem){if (coordinates == null || sourceCoordinateSystem == null || targetCoordinateSystem==null)throw new Exception("请输入正确的参数");NetTopologySuite.Geometries.PrecisionModel precisionModel = new NetTopologySuite.Geometries.PrecisionModel(GeoAPI.Geometries.PrecisionModels.Floating);int SRID_source = Convert.ToInt32(sourceCoordinateSystem.AuthorityCode); //source SRIDint SRID_target = Convert.ToInt32(targetCoordinateSystem.AuthorityCode); //target SRIDProjNet.CoordinateSystems.Transformations.CoordinateTransformationFactory transformationFactory = new ProjNet.CoordinateSystems.Transformations.CoordinateTransformationFactory();GeoAPI.CoordinateSystems.Transformations.ICoordinateTransformation transformation = transformationFactory.CreateFromCoordinateSystems(sourceCoordinateSystem, targetCoordinateSystem);//NetTopologySuite.Geometries.GeometryFactory factory_source = new NetTopologySuite.Geometries.GeometryFactory(precisionModel, SRID_source);IList<Coordinate> coords = transformation.MathTransform.TransformList(coordinates);return coords.ToList();}public static List<PointLatLng> ConvertCoordinates(List<PointLatLng> coordinates, ICoordinateSystem sourceCoordinateSystem, ICoordinateSystem targetCoordinateSystem){List<Coordinate> tempCoordinates = new List<Coordinate>();foreach(var entity in coordinates){tempCoordinates.Add(new Coordinate(x: entity.Lng, y: entity.Lat));}if (coordinates == null || sourceCoordinateSystem == null || targetCoordinateSystem == null)throw new Exception("请输入正确的参数");NetTopologySuite.Geometries.PrecisionModel precisionModel = new NetTopologySuite.Geometries.PrecisionModel(GeoAPI.Geometries.PrecisionModels.Floating);int SRID_source = Convert.ToInt32(sourceCoordinateSystem.AuthorityCode); //source SRIDint SRID_target = Convert.ToInt32(targetCoordinateSystem.AuthorityCode); //target SRIDProjNet.CoordinateSystems.Transformations.CoordinateTransformationFactory transformationFactory = new ProjNet.CoordinateSystems.Transformations.CoordinateTransformationFactory();GeoAPI.CoordinateSystems.Transformations.ICoordinateTransformation transformation = transformationFactory.CreateFromCoordinateSystems(sourceCoordinateSystem, targetCoordinateSystem);//NetTopologySuite.Geometries.GeometryFactory factory_source = new NetTopologySuite.Geometries.GeometryFactory(precisionModel, SRID_source);IList<Coordinate> coords = transformation.MathTransform.TransformList(tempCoordinates);List<PointLatLng> points = new List<PointLatLng>();foreach(var entity in coords){if (double.IsNaN(entity.X) || double.IsNaN(entity.Y))continue;points.Add(new PointLatLng(entity.Y, entity.X));}return points;}public static double GetArea(List<PointLatLng> pointLatLngs){if (pointLatLngs == null){return 0;}if (pointLatLngs.Count <= 2){return 0;}List<GeoAPI.Geometries.Coordinate> coordinates = WGS84ToWebMercator(pointLatLngs);if (coordinates[0].X != coordinates[coordinates.Count - 1].X ||coordinates[0].Y != coordinates[coordinates.Count - 1].Y){coordinates.Add(new GeoAPI.Geometries.Coordinate(coordinates[0].X, coordinates[0].Y));}NetTopologySuite.Geometries.LinearRing linearRing = new NetTopologySuite.Geometries.LinearRing(coordinates.ToArray());NetTopologySuite.Geometries.Polygon polygon = new NetTopologySuite.Geometries.Polygon(linearRing);IPoint point = polygon.Centroid;return polygon.Area;}public static double GetArea(GMapPolygon mapPolygon){if (mapPolygon == null){return 0;}return GetArea(mapPolygon.Points);}public static RectLatLng GetRegionMaxRect(GMapPolygon polygon){double latMin = 90;double latMax = -90;double lngMin = 180;double lngMax = -180;foreach (var point in polygon.Points){if (point.Lat < latMin){latMin = point.Lat;}if (point.Lat > latMax){latMax = point.Lat;}if (point.Lng < lngMin){lngMin = point.Lng;}if (point.Lng > lngMax){lngMax = point.Lng;}}return new RectLatLng(latMax, lngMin, lngMax - lngMin, latMax - latMin);}public static double GetDistance(double lat1, double lng1, double lat2, double lng2){PointLatLng first = new PointLatLng(lat2,lng1);PointLatLng second = new PointLatLng(lat2,lng2);List<PointLatLng> pointLatLngs = new List<PointLatLng>();pointLatLngs.Add(first);pointLatLngs.Add(second);var coordinates= WGS84ToWebMercator(pointLatLngs);NetTopologySuite.Geometries.LineString lineString = new NetTopologySuite.Geometries.LineString(coordinates.ToArray());return lineString.Length;}public static double GetDistance2(double lat1, double lng1, double lat2, double lng2){double radLat1 = DegreesToRadians(lat1);double radLat2 = DegreesToRadians(lat2);double a = radLat1 - radLat2;double b = DegreesToRadians(lng1) - DegreesToRadians(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 * EARTH_RADIUS;s = Math.Round(s * 10000) / 10000;return s;}/// <summary>/// 求B点经纬度/// </summary>/// <param name="A">已知点的经纬度</param>/// <param name="distance">AB两地的距离 单位km</param>/// <param name="angle">AB连线与正北方向的夹角(0~360)</param>/// <returns>B点的经纬度</returns>public static CustomLatLng GetCustomLatLng(CustomLatLng A, double distance, double angle){double dx = distance * 1000 * Math.Sin(DegreesToRadians(angle));double dy = distance * 1000 * Math.Cos(DegreesToRadians(angle));double bjd = (dx / A.Ed + A.m_RadLo) * 180 / Math.PI;double bwd = (dy / A.Ec + A.m_RadLa) * 180 / Math.PI;return new CustomLatLng(bjd, bwd);}//度 转换成 弧度public static double DegreesToRadians(double degrees){const double degToRadFactor = Math.PI / 180;return degrees * degToRadFactor;}/// <summary>/// 弧度 转换成 度/// </summary>/// <param name="radians"></param>/// <returns></returns>public static double RadiansToDegrees(double radians){const double radToDegFactor = 180 / Math.PI;return radians * radToDegFactor;}/// <summary>/// 描述:以centerP为圆心,绘制半径为radius的圆/// </summary>/// <param name="gMapControl">overlay:图层</param>/// <param name="overlay">图层</param>/// <param name="centerP">圆心点</param>/// <param name="radius">圆半径(单位: km)</param>/// <param name="name">多边形id</param>public static GMapPolygon DrawEllipse(GMapControl gMapControl, GMapOverlay overlay, PointLatLng centerP, int radius, string name){try{if (radius <= 0)return null;List<PointLatLng> latLngs = new List<PointLatLng>();CustomLatLng centerLatLng = new CustomLatLng(centerP.Lng, centerP.Lat);// 0 - 360度 寻找半径为radius,圆心为centerP的圆上点的经纬度for (int i = 0; i < 360; i++){//获取目标经纬度CustomLatLng tempLatLng = GetCustomLatLng(centerLatLng, radius, i);//将自定义的经纬度类 转换成 标准经纬度类PointLatLng p = new PointLatLng(tempLatLng.m_Latitude, tempLatLng.m_Longitude);latLngs.Add(p);}//安全性检查if (latLngs.Count < 20){return null;}//通过绘制多边形的方式绘制圆GMapPolygon gpol = new GMapPolygon(latLngs, name);gpol.Stroke = new Pen(Color.Red, 1.0f);gpol.Fill = new SolidBrush(Color.FromArgb(20, Color.Red));gpol.IsHitTestVisible = true;overlay.Polygons.Add(gpol);return gpol;}catch (Exception ex){return null;}}}//自定义经纬度类public class CustomLatLng{public double Rc = 6378137; //赤道半径public double Rj = 6356725; //极半径public double m_LoDeg, m_LoMin, m_LoSec;public double m_LaDeg, m_LaMin, m_LaSec;public double m_Longitude, m_Latitude;public double m_RadLo, m_RadLa;public double Ec;public double Ed;public CustomLatLng(double longitude, double latitude){m_LoDeg = (int)longitude;m_LoMin = (int)((longitude - m_LoDeg) * 60);m_LoSec = (longitude - m_LoDeg - m_LoMin / 60) * 3600;m_LaDeg = (int)latitude;m_LaMin = (int)((latitude - m_LaDeg) * 60);m_LaSec = (latitude - m_LaDeg - m_LaMin / 60) * 3600;m_Longitude = longitude;m_Latitude = latitude;m_RadLo = longitude * Math.PI / 180;m_RadLa = latitude * Math.PI / 180;Ec = Rj + (Rc - Rj) * (90 - m_Latitude) / 90;Ed = Ec * Math.Cos(m_RadLa);}}

















