623 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			623 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			C#
		
	
	
	
| 
								 | 
							
								using LY.App.Model;
							 | 
						|||
| 
								 | 
							
								using NetTopologySuite.Features;
							 | 
						|||
| 
								 | 
							
								using NetTopologySuite.Geometries;
							 | 
						|||
| 
								 | 
							
								using NetTopologySuite.IO;
							 | 
						|||
| 
								 | 
							
								using Newtonsoft.Json;
							 | 
						|||
| 
								 | 
							
								using Newtonsoft.Json.Linq;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								namespace LY.App.Common
							 | 
						|||
| 
								 | 
							
								{
							 | 
						|||
| 
								 | 
							
								    public class GeoJsonHelper
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        /// <summary>
							 | 
						|||
| 
								 | 
							
								        /// 格式为json字符串
							 | 
						|||
| 
								 | 
							
								        /// </summary>
							 | 
						|||
| 
								 | 
							
								        /// <param name="str"></param>
							 | 
						|||
| 
								 | 
							
								        /// <returns></returns>
							 | 
						|||
| 
								 | 
							
								        public static string ConvertJsonString(string str)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            try
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                //格式化json字符串
							 | 
						|||
| 
								 | 
							
								                JsonSerializer serializer = new JsonSerializer();
							 | 
						|||
| 
								 | 
							
								                TextReader tr = new StringReader(str);
							 | 
						|||
| 
								 | 
							
								                JsonTextReader jtr = new JsonTextReader(tr);
							 | 
						|||
| 
								 | 
							
								                object obj = serializer.Deserialize(jtr);
							 | 
						|||
| 
								 | 
							
								                if (obj != null)
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                    StringWriter textWriter = new StringWriter();
							 | 
						|||
| 
								 | 
							
								                    JsonTextWriter jsonWriter = new JsonTextWriter(textWriter)
							 | 
						|||
| 
								 | 
							
								                    {
							 | 
						|||
| 
								 | 
							
								                        Formatting = Formatting.Indented,
							 | 
						|||
| 
								 | 
							
								                        Indentation = 4,
							 | 
						|||
| 
								 | 
							
								                        IndentChar = ' '
							 | 
						|||
| 
								 | 
							
								                    };
							 | 
						|||
| 
								 | 
							
								                    serializer.Serialize(jsonWriter, obj);
							 | 
						|||
| 
								 | 
							
								                    return textWriter.ToString();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								                else
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    return str;
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            catch (Exception)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            return str;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        /// <summary>
							 | 
						|||
| 
								 | 
							
								        /// 转换为geojson格式字符串
							 | 
						|||
| 
								 | 
							
								        /// </summary>
							 | 
						|||
| 
								 | 
							
								        /// <param name="value"></param>
							 | 
						|||
| 
								 | 
							
								        /// <returns></returns>
							 | 
						|||
| 
								 | 
							
								        public static string GetGeoJson(object? value)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            if (value == null)
							 | 
						|||
| 
								 | 
							
								                return "";
							 | 
						|||
| 
								 | 
							
								            var serializer = GeoJsonSerializer.Create();
							 | 
						|||
| 
								 | 
							
								            using (var sw = new System.IO.StringWriter())
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                serializer.Serialize(sw, value);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                return sw.ToString();
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        /// <summary>
							 | 
						|||
| 
								 | 
							
								        /// 将坐标转换为点
							 | 
						|||
| 
								 | 
							
								        /// </summary>
							 | 
						|||
| 
								 | 
							
								        /// <param name="x">经度</param>
							 | 
						|||
| 
								 | 
							
								        /// <param name="y">纬度</param>
							 | 
						|||
| 
								 | 
							
								        /// <returns></returns>
							 | 
						|||
| 
								 | 
							
								        public static NetTopologySuite.Geometries.Point ConvertToPoint(double x, double y)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            return new NetTopologySuite.Geometries.Point(x, y);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public static object? GetDynamicFeature(Geometry geometry, IDictionary<string, object> attributes)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            var f = GetGeoFeature(geometry, attributes);
							 | 
						|||
| 
								 | 
							
								            var geoJson = GetGeoJson(f);
							 | 
						|||
| 
								 | 
							
								            return geoJson;
							 | 
						|||
| 
								 | 
							
								            // return JsonConvert.DeserializeObject(geoJson);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        /// <summary>
							 | 
						|||
| 
								 | 
							
								        /// 获取集合中能够组成多面的几何数据
							 | 
						|||
| 
								 | 
							
								        /// </summary>
							 | 
						|||
| 
								 | 
							
								        /// <param name="features"></param>
							 | 
						|||
| 
								 | 
							
								        /// <returns></returns>
							 | 
						|||
| 
								 | 
							
								        public static List<MultiPolygon> GetGeoMultiPolygon(FeatureCollection features)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            var result = new List<MultiPolygon>();
							 | 
						|||
| 
								 | 
							
								            if (features == null)
							 | 
						|||
| 
								 | 
							
								                return result;
							 | 
						|||
| 
								 | 
							
								            foreach (var feature in features)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                if (feature.Geometry is MultiPolygon)
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    result.Add(feature.Geometry as MultiPolygon);
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								                else if (feature.Geometry is Polygon)
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    result.Add(new MultiPolygon(new Polygon[] { feature.Geometry as Polygon }));
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								                else if (feature.Geometry is LineString)
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    var line = (LineString)feature.Geometry;
							 | 
						|||
| 
								 | 
							
								                    if (line.IsRing)
							 | 
						|||
| 
								 | 
							
								                    {
							 | 
						|||
| 
								 | 
							
								                        result.Add(new MultiPolygon(new Polygon[] { new Polygon(new LinearRing(line.Coordinates)) }));
							 | 
						|||
| 
								 | 
							
								                    }
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            return result;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        /// <summary>
							 | 
						|||
| 
								 | 
							
								        /// 获取集合中能够组成多线的几何数据
							 | 
						|||
| 
								 | 
							
								        /// </summary>
							 | 
						|||
| 
								 | 
							
								        /// <param name="features"></param>
							 | 
						|||
| 
								 | 
							
								        /// <returns></returns>
							 | 
						|||
| 
								 | 
							
								        public static List<MultiLineString> GetGeoMultiLineString(FeatureCollection features)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            var result = new List<MultiLineString>();
							 | 
						|||
| 
								 | 
							
								            if (features == null)
							 | 
						|||
| 
								 | 
							
								                return result;
							 | 
						|||
| 
								 | 
							
								            foreach (var feature in features)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                if (feature.Geometry is MultiLineString)
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    result.Add(feature.Geometry as MultiLineString);
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								                else if (feature.Geometry is LineString)
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    result.Add(new MultiLineString(new LineString[] { feature.Geometry as LineString }));
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								                else if (feature.Geometry is MultiPoint)
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    var mp = (MultiPoint)feature.Geometry;
							 | 
						|||
| 
								 | 
							
								                    if (mp.Count() > 1)
							 | 
						|||
| 
								 | 
							
								                    {
							 | 
						|||
| 
								 | 
							
								                        result.Add(new MultiLineString(new LineString[] { new LineString(mp.Coordinates) }));
							 | 
						|||
| 
								 | 
							
								                    }
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            return result;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        /// <summary>
							 | 
						|||
| 
								 | 
							
								        /// 将geojson转为FeatureCollection,
							 | 
						|||
| 
								 | 
							
								        /// 原json支持点、线面等
							 | 
						|||
| 
								 | 
							
								        /// </summary>
							 | 
						|||
| 
								 | 
							
								        /// <param name="geoJson"></param>
							 | 
						|||
| 
								 | 
							
								        /// <returns></returns>
							 | 
						|||
| 
								 | 
							
								        public static FeatureCollection? GetGeoFeatureCollectionBuild(string geoJson)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            if (string.IsNullOrWhiteSpace(geoJson)) return null;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            try
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                var jObj = JObject.Parse(geoJson);
							 | 
						|||
| 
								 | 
							
								                if (jObj != null)
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    if (jObj.TryGetValue("type", out var jToken))
							 | 
						|||
| 
								 | 
							
								                    {
							 | 
						|||
| 
								 | 
							
								                        if (jToken != null)
							 | 
						|||
| 
								 | 
							
								                        {
							 | 
						|||
| 
								 | 
							
								                            if (string.Compare(jToken.ToString(), "FeatureCollection") == 0)
							 | 
						|||
| 
								 | 
							
								                            {
							 | 
						|||
| 
								 | 
							
								                                return GetGeoFeatureCollection(geoJson);
							 | 
						|||
| 
								 | 
							
								                            }
							 | 
						|||
| 
								 | 
							
								                            else
							 | 
						|||
| 
								 | 
							
								                            {
							 | 
						|||
| 
								 | 
							
								                                var f = GetGeoFeatureBuild(geoJson);
							 | 
						|||
| 
								 | 
							
								                                if (f != null)
							 | 
						|||
| 
								 | 
							
								                                {
							 | 
						|||
| 
								 | 
							
								                                    var result = new FeatureCollection();
							 | 
						|||
| 
								 | 
							
								                                    result.Add(f);
							 | 
						|||
| 
								 | 
							
								                                    return result;
							 | 
						|||
| 
								 | 
							
								                                }
							 | 
						|||
| 
								 | 
							
								                            }
							 | 
						|||
| 
								 | 
							
								                        }
							 | 
						|||
| 
								 | 
							
								                    }
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            catch (Exception)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                throw new Exception("geojson无效");
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            return null;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public static Feature? GetGeoFeatureBuild(string geoJson)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            var jObj = JObject.Parse(geoJson);
							 | 
						|||
| 
								 | 
							
								            if (jObj != null)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                //先判断type  
							 | 
						|||
| 
								 | 
							
								                if (jObj.TryGetValue("type", out var jToken))
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    if (jToken != null)
							 | 
						|||
| 
								 | 
							
								                    {
							 | 
						|||
| 
								 | 
							
								                        if (string.Compare(jToken.ToString(), "Feature") == 0)
							 | 
						|||
| 
								 | 
							
								                        {
							 | 
						|||
| 
								 | 
							
								                            return GetGeoFeature(geoJson);
							 | 
						|||
| 
								 | 
							
								                        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                        Geometry? geometry = null;
							 | 
						|||
| 
								 | 
							
								                        if (string.Compare(jToken.ToString(), "Point") == 0)
							 | 
						|||
| 
								 | 
							
								                        {
							 | 
						|||
| 
								 | 
							
								                            geometry = GetGeoPoint(geoJson);
							 | 
						|||
| 
								 | 
							
								                        }
							 | 
						|||
| 
								 | 
							
								                        if (string.Compare(jToken.ToString(), "MultiPoint") == 0)
							 | 
						|||
| 
								 | 
							
								                        {
							 | 
						|||
| 
								 | 
							
								                            geometry = GetGeoMultiPoint(geoJson);
							 | 
						|||
| 
								 | 
							
								                        }
							 | 
						|||
| 
								 | 
							
								                        if (string.Compare(jToken.ToString(), "LineString") == 0)
							 | 
						|||
| 
								 | 
							
								                        {
							 | 
						|||
| 
								 | 
							
								                            geometry = GetGeoLineString(geoJson);
							 | 
						|||
| 
								 | 
							
								                        }
							 | 
						|||
| 
								 | 
							
								                        if (string.Compare(jToken.ToString(), "MultiLineString") == 0)
							 | 
						|||
| 
								 | 
							
								                        {
							 | 
						|||
| 
								 | 
							
								                            geometry = GetGeoMultiLineString(geoJson);
							 | 
						|||
| 
								 | 
							
								                        }
							 | 
						|||
| 
								 | 
							
								                        if (string.Compare(jToken.ToString(), "Polygon") == 0)
							 | 
						|||
| 
								 | 
							
								                        {
							 | 
						|||
| 
								 | 
							
								                            geometry = GetGeoPolygon(geoJson);
							 | 
						|||
| 
								 | 
							
								                        }
							 | 
						|||
| 
								 | 
							
								                        if (string.Compare(jToken.ToString(), "MultiPolygon") == 0)
							 | 
						|||
| 
								 | 
							
								                        {
							 | 
						|||
| 
								 | 
							
								                            geometry = GetGeoMultiPolygon(geoJson);
							 | 
						|||
| 
								 | 
							
								                        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                        if (geometry != null)
							 | 
						|||
| 
								 | 
							
								                            return new Feature(geometry, new AttributesTable());
							 | 
						|||
| 
								 | 
							
								                    }
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            return null;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public static Feature? GetGeoFeature(Geometry geometry, IDictionary<string, object> attributes)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            AttributesTable attributesTable = new AttributesTable();
							 | 
						|||
| 
								 | 
							
								            foreach (var item in attributes)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                attributesTable.Add(item.Key, item.Value);
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            var result = new Feature(geometry, attributesTable);
							 | 
						|||
| 
								 | 
							
								            return result;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public static Feature? GetGeoFeature(string geoJson)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            var serializer = GeoJsonSerializer.Create();
							 | 
						|||
| 
								 | 
							
								            using (var stringReader = new StringReader(geoJson))
							 | 
						|||
| 
								 | 
							
								            using (var jsonReader = new JsonTextReader(stringReader))
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                return serializer.Deserialize<NetTopologySuite.Features.Feature>(jsonReader);
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public static FeatureCollection? GetGeoFeatureCollection(string geoJson)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            var serializer = GeoJsonSerializer.Create();
							 | 
						|||
| 
								 | 
							
								            using (var stringReader = new StringReader(geoJson))
							 | 
						|||
| 
								 | 
							
								            using (var jsonReader = new JsonTextReader(stringReader))
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                return serializer.Deserialize<NetTopologySuite.Features.FeatureCollection>(jsonReader);
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public static NetTopologySuite.Geometries.Point? GetGeoPoint(string geoJson)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            var jObj = JObject.Parse(geoJson);
							 | 
						|||
| 
								 | 
							
								            if (jObj != null)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                //先判断type  
							 | 
						|||
| 
								 | 
							
								                if (jObj.TryGetValue("type", out var jToken))
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    if (jToken != null)
							 | 
						|||
| 
								 | 
							
								                    {
							 | 
						|||
| 
								 | 
							
								                        if (string.Compare(jToken.ToString(), "Feature") == 0)
							 | 
						|||
| 
								 | 
							
								                        {
							 | 
						|||
| 
								 | 
							
								                            var f = GetGeoFeature(geoJson);
							 | 
						|||
| 
								 | 
							
								                            if (f.Geometry is Point)
							 | 
						|||
| 
								 | 
							
								                                return f.Geometry as NetTopologySuite.Geometries.Point;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                        }
							 | 
						|||
| 
								 | 
							
								                        else
							 | 
						|||
| 
								 | 
							
								                        {
							 | 
						|||
| 
								 | 
							
								                            var serializer = GeoJsonSerializer.Create();
							 | 
						|||
| 
								 | 
							
								                            using (var stringReader = new StringReader(geoJson))
							 | 
						|||
| 
								 | 
							
								                            using (var jsonReader = new JsonTextReader(stringReader))
							 | 
						|||
| 
								 | 
							
								                            {
							 | 
						|||
| 
								 | 
							
								                                return serializer.Deserialize<NetTopologySuite.Geometries.Point>(jsonReader);
							 | 
						|||
| 
								 | 
							
								                            }
							 | 
						|||
| 
								 | 
							
								                        }
							 | 
						|||
| 
								 | 
							
								                    }
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            return null;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public static NetTopologySuite.Geometries.MultiPoint? GetGeoMultiPoint(string geoJson)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            var serializer = GeoJsonSerializer.Create();
							 | 
						|||
| 
								 | 
							
								            using (var stringReader = new StringReader(geoJson))
							 | 
						|||
| 
								 | 
							
								            using (var jsonReader = new JsonTextReader(stringReader))
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                return serializer.Deserialize<NetTopologySuite.Geometries.MultiPoint>(jsonReader);
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public static NetTopologySuite.Geometries.LineString? GetGeoLineString(string geoJson)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            var serializer = GeoJsonSerializer.Create();
							 | 
						|||
| 
								 | 
							
								            using (var stringReader = new StringReader(geoJson))
							 | 
						|||
| 
								 | 
							
								            using (var jsonReader = new JsonTextReader(stringReader))
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                return serializer.Deserialize<NetTopologySuite.Geometries.LineString>(jsonReader);
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public static NetTopologySuite.Geometries.MultiLineString? GetGeoMultiLineString(string geoJson)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            var serializer = GeoJsonSerializer.Create();
							 | 
						|||
| 
								 | 
							
								            using (var stringReader = new StringReader(geoJson))
							 | 
						|||
| 
								 | 
							
								            using (var jsonReader = new JsonTextReader(stringReader))
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                return serializer.Deserialize<NetTopologySuite.Geometries.MultiLineString>(jsonReader);
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public static NetTopologySuite.Geometries.Polygon? GetGeoPolygon(string geoJson)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            var serializer = GeoJsonSerializer.Create();
							 | 
						|||
| 
								 | 
							
								            using (var stringReader = new StringReader(geoJson))
							 | 
						|||
| 
								 | 
							
								            using (var jsonReader = new JsonTextReader(stringReader))
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                return serializer.Deserialize<NetTopologySuite.Geometries.Polygon>(jsonReader);
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public static NetTopologySuite.Geometries.MultiPolygon? GetGeoMultiPolygon(string geoJson)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            var serializer = GeoJsonSerializer.Create();
							 | 
						|||
| 
								 | 
							
								            using (var stringReader = new StringReader(geoJson))
							 | 
						|||
| 
								 | 
							
								            using (var jsonReader = new JsonTextReader(stringReader))
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                return serializer.Deserialize<NetTopologySuite.Geometries.MultiPolygon>(jsonReader);
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public static bool TryGetGeomWKTFromGeoJson(string? geoJson, out MultiPolygon? geometry)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            geometry = null;
							 | 
						|||
| 
								 | 
							
								            try
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                if (!string.IsNullOrWhiteSpace(geoJson))
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    var features = GeoJsonHelper.GetGeoFeatureCollectionBuild(geoJson);
							 | 
						|||
| 
								 | 
							
								                    var multPolygons = GeoJsonHelper.GetGeoMultiPolygon(features);
							 | 
						|||
| 
								 | 
							
								                    if (multPolygons?.Count > 0)
							 | 
						|||
| 
								 | 
							
								                    {
							 | 
						|||
| 
								 | 
							
								                        geometry = multPolygons[0];
							 | 
						|||
| 
								 | 
							
								                        geometry.SRID = 4326;
							 | 
						|||
| 
								 | 
							
								                        return true;
							 | 
						|||
| 
								 | 
							
								                    }
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            catch
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            return false;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        public static Geometry FromWKT(string wktData)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            WKTReader reader = new WKTReader();
							 | 
						|||
| 
								 | 
							
								            return reader.Read(wktData);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public static Geometry FromWKB(byte[] wkbData)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            WKBReader reader = new WKBReader();
							 | 
						|||
| 
								 | 
							
								            return reader.Read(wkbData);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        public static Polygon Transfer2CoordinateByCoords(List<Point> Coords)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            if (Coords.Any())
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                var list = Coords.Select(s => s.X + "" + s.Y).ToList();
							 | 
						|||
| 
								 | 
							
								                var content = $"POLYGON(({string.Join(",", list)}))";
							 | 
						|||
| 
								 | 
							
								                WKTReader wktReader = new WKTReader();
							 | 
						|||
| 
								 | 
							
								                Polygon polygon = wktReader.Read(content) as Polygon;
							 | 
						|||
| 
								 | 
							
								                return polygon;
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            return null;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        #region 坐标相关方法
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        private static GeometryFactory _gf = NetTopologySuite.NtsGeometryServices.Instance.CreateGeometryFactory(4326);
							 | 
						|||
| 
								 | 
							
								        public static bool IsWithin(BasePoint pnt, BasePoint[] polygon)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            if (IsValidPolygon(polygon))
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                var point = CreatPoint(pnt);
							 | 
						|||
| 
								 | 
							
								                var region = CreatePolygon(polygon);
							 | 
						|||
| 
								 | 
							
								                return point.Within(region);
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            return false;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        /// <summary>
							 | 
						|||
| 
								 | 
							
								        /// 判断点是否在多边形内
							 | 
						|||
| 
								 | 
							
								        /// </summary>
							 | 
						|||
| 
								 | 
							
								        /// <param name="pnt"></param>
							 | 
						|||
| 
								 | 
							
								        /// <param name="multiPolygon"></param>
							 | 
						|||
| 
								 | 
							
								        /// <returns></returns>
							 | 
						|||
| 
								 | 
							
								        public static bool isWithin(BasePoint pnt, MultiPolygon multiPolygon)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            var point = CreatPoint(pnt);
							 | 
						|||
| 
								 | 
							
								            return point.Within(multiPolygon);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        /// <summary>
							 | 
						|||
| 
								 | 
							
								        /// 基本判断点数据是否有效转为面
							 | 
						|||
| 
								 | 
							
								        /// </summary>
							 | 
						|||
| 
								 | 
							
								        /// <param name="polygon"></param>
							 | 
						|||
| 
								 | 
							
								        /// <returns></returns>
							 | 
						|||
| 
								 | 
							
								        public static bool IsValidPolygon(BasePoint[] polygon)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            if (polygon?.Count() >= 4)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                //polygon.Distinct();//重复点?
							 | 
						|||
| 
								 | 
							
								                return polygon[0].Equal(polygon[polygon.Count() - 1]);
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            return false;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        /// <summary>
							 | 
						|||
| 
								 | 
							
								        /// 基本判断点数据是否有效转为线
							 | 
						|||
| 
								 | 
							
								        /// </summary>
							 | 
						|||
| 
								 | 
							
								        /// <param name="polygon"></param>
							 | 
						|||
| 
								 | 
							
								        /// <returns></returns>
							 | 
						|||
| 
								 | 
							
								        public static bool IsValidLineString(BasePoint[] polygon)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            if (polygon?.Count() >= 2)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                //polygon.Distinct();//重复点?
							 | 
						|||
| 
								 | 
							
								                return true;
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            return false;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        /// <summary>
							 | 
						|||
| 
								 | 
							
								        /// 创建点
							 | 
						|||
| 
								 | 
							
								        /// </summary>
							 | 
						|||
| 
								 | 
							
								        /// <param name="pnt"></param>
							 | 
						|||
| 
								 | 
							
								        /// <returns></returns>
							 | 
						|||
| 
								 | 
							
								        public static Point CreatPoint(BasePoint pnt)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            return _gf.CreatePoint(GetCoordinate(pnt));
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        /// <summary>
							 | 
						|||
| 
								 | 
							
								        /// 创建点
							 | 
						|||
| 
								 | 
							
								        /// </summary>
							 | 
						|||
| 
								 | 
							
								        /// <param name="pnt"></param>
							 | 
						|||
| 
								 | 
							
								        /// <returns></returns>
							 | 
						|||
| 
								 | 
							
								        public static Point CreatPoint(double x, double y)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            return _gf.CreatePoint(GetCoordinate(x, y));
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        /// <summary>
							 | 
						|||
| 
								 | 
							
								        /// 创建线
							 | 
						|||
| 
								 | 
							
								        /// </summary>
							 | 
						|||
| 
								 | 
							
								        /// <param name="polygon"></param>
							 | 
						|||
| 
								 | 
							
								        /// <returns></returns>
							 | 
						|||
| 
								 | 
							
								        public static LineString CreateLineString(BasePoint[] points)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            return _gf.CreateLineString(GetCoordinate(points));
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        /// <summary>
							 | 
						|||
| 
								 | 
							
								        /// 创建面
							 | 
						|||
| 
								 | 
							
								        /// </summary>
							 | 
						|||
| 
								 | 
							
								        /// <param name="polygon"></param>
							 | 
						|||
| 
								 | 
							
								        /// <returns></returns>
							 | 
						|||
| 
								 | 
							
								        public static Polygon CreatePolygon(BasePoint[] polygon)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            return _gf.CreatePolygon(GetCoordinate(polygon));
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        /// <summary>
							 | 
						|||
| 
								 | 
							
								        /// 点转换到坐标
							 | 
						|||
| 
								 | 
							
								        /// </summary>
							 | 
						|||
| 
								 | 
							
								        /// <param name="pnt"></param>
							 | 
						|||
| 
								 | 
							
								        /// <returns></returns>
							 | 
						|||
| 
								 | 
							
								        public static NetTopologySuite.Geometries.Coordinate GetCoordinate(BasePoint pnt)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            return new NetTopologySuite.Geometries.Coordinate(pnt.X, pnt.Y);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        /// <summary>
							 | 
						|||
| 
								 | 
							
								        /// 点转换到坐标
							 | 
						|||
| 
								 | 
							
								        /// </summary>
							 | 
						|||
| 
								 | 
							
								        /// <param name="pnt"></param>
							 | 
						|||
| 
								 | 
							
								        /// <returns></returns>
							 | 
						|||
| 
								 | 
							
								        public static NetTopologySuite.Geometries.Coordinate GetCoordinate(double x, double y)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            return new NetTopologySuite.Geometries.Coordinate(x, y);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        /// <summary>
							 | 
						|||
| 
								 | 
							
								        /// 点组转换坐标组
							 | 
						|||
| 
								 | 
							
								        /// </summary>
							 | 
						|||
| 
								 | 
							
								        /// <param name="polygon"></param>
							 | 
						|||
| 
								 | 
							
								        /// <returns></returns>
							 | 
						|||
| 
								 | 
							
								        public static NetTopologySuite.Geometries.Coordinate[] GetCoordinate(BasePoint[] polygon)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            List<NetTopologySuite.Geometries.Coordinate> coordinates = new List<NetTopologySuite.Geometries.Coordinate>();
							 | 
						|||
| 
								 | 
							
								            foreach (var item in polygon)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                coordinates.Add(GetCoordinate(item));
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            return coordinates.ToArray();
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public static Geometry CreateCircleMercator(double x, double y, double radius)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            var geometryFactory = new GeometryFactory();
							 | 
						|||
| 
								 | 
							
								            var wbp = CoordConvert.WGS84ToMercator(x, y);
							 | 
						|||
| 
								 | 
							
								            var point1 = geometryFactory.CreatePoint(new NetTopologySuite.Geometries.Coordinate(wbp.X, wbp.Y));
							 | 
						|||
| 
								 | 
							
								            var geo = point1.Buffer(radius, 80);
							 | 
						|||
| 
								 | 
							
								            //var geo1 = point1.Buffer(radius);
							 | 
						|||
| 
								 | 
							
								            return geo;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        /// <summary>
							 | 
						|||
| 
								 | 
							
								        /// 创建圆形
							 | 
						|||
| 
								 | 
							
								        /// </summary>
							 | 
						|||
| 
								 | 
							
								        /// <param name="x"></param>
							 | 
						|||
| 
								 | 
							
								        /// <param name="y"></param>
							 | 
						|||
| 
								 | 
							
								        /// <param name="radius"></param>
							 | 
						|||
| 
								 | 
							
								        /// <returns></returns>
							 | 
						|||
| 
								 | 
							
								        public static Geometry CreateCircle(double x, double y, double radius, int pnts = 100)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            var geo1 = CreateCircleMercator(x, y, radius);
							 | 
						|||
| 
								 | 
							
								            var coordinates = geo1.Coordinates;
							 | 
						|||
| 
								 | 
							
								            List<BasePoint> points = new List<BasePoint>();
							 | 
						|||
| 
								 | 
							
								            foreach (var item in coordinates)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                var wgs84 = CoordConvert.MercatorToWGS84(item.X, item.Y);
							 | 
						|||
| 
								 | 
							
								                points.Add(new BasePoint(wgs84.Lon, wgs84.Lat, 0));
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            return CreatePolygon(points.ToArray());
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        public static double CalculateCircleAreaKmUnit(double x, double y, double radius)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            if (x > 0 && y > 0 && radius > 0)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                var area11 = CalculateCircleArea(x, y, radius);
							 | 
						|||
| 
								 | 
							
								                return Math.Round(area11 / 1000000, 5);
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            return 0;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        public static double CalculateCircleArea(double x, double y, double radius)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            if (x > 0 && y > 0 && radius > 0)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                var geo1 = CreateCircleMercator(x, y, radius);
							 | 
						|||
| 
								 | 
							
								                return geo1.Area;
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            return 0;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        /// <summary>
							 | 
						|||
| 
								 | 
							
								        /// 计算合并后的总面积
							 | 
						|||
| 
								 | 
							
								        /// </summary>
							 | 
						|||
| 
								 | 
							
								        /// <param name="geometries"></param>
							 | 
						|||
| 
								 | 
							
								        /// <returns></returns>
							 | 
						|||
| 
								 | 
							
								        public static double CalculateAreaMercator(Geometry[] geometries)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            //将多个 Geometry 合并成一个 Geometry,避免交集重复计算
							 | 
						|||
| 
								 | 
							
								            var unionedGeometry = _gf.BuildGeometry(geometries).Union();
							 | 
						|||
| 
								 | 
							
								            string geojson = GetGeoJson(unionedGeometry);
							 | 
						|||
| 
								 | 
							
								            var area = unionedGeometry.Area;
							 | 
						|||
| 
								 | 
							
								            // 计算合并后的总面积
							 | 
						|||
| 
								 | 
							
								            return area;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        ///// <summary>
							 | 
						|||
| 
								 | 
							
								        ///// 计算合并后的总面积
							 | 
						|||
| 
								 | 
							
								        ///// </summary>
							 | 
						|||
| 
								 | 
							
								        ///// <param name="geometries"></param>
							 | 
						|||
| 
								 | 
							
								        ///// <returns></returns>
							 | 
						|||
| 
								 | 
							
								        //public static double CalculateArea(Geometry[] geometries)
							 | 
						|||
| 
								 | 
							
								        //{
							 | 
						|||
| 
								 | 
							
								        //    //将多个 Geometry 合并成一个 Geometry,避免交集重复计算
							 | 
						|||
| 
								 | 
							
								        //    var unionedGeometry = _gf.BuildGeometry(geometries).Union();
							 | 
						|||
| 
								 | 
							
								        //    string geojson = GetGeoJson(unionedGeometry);
							 | 
						|||
| 
								 | 
							
								        //    var area = Math.Round(unionedGeometry.ProjectTo(2855).Area / 1000000.0, 5);
							 | 
						|||
| 
								 | 
							
								        //    // 计算合并后的总面积
							 | 
						|||
| 
								 | 
							
								        //    return area;
							 | 
						|||
| 
								 | 
							
								        //}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        #endregion
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								}
							 |