/// <summary> /// Creates a new geometry from JSON. /// </summary> /// <param name="json"></param> /// <returns></returns> public static Geometry ToGeometry(string json) { if (json == null) { return(null); } if (json.Contains("x") && json.Contains("y")) { return(Point.FromJson(json)); } if (json.Contains("points")) { return(Multipoint.FromJson(json)); } if (json.Contains("paths")) { return(Polyline.FromJson(json)); } if (json.Contains("rings")) { return(Polygon.FromJson(json)); } throw new ArgumentException("This geometry type is not supported.", nameof(json)); }
private static XElement ToKmlMultipoint(this Multipoint geometry, double?z, XElement[] extraElements) { return(new XElement(ns + "MultiGeometry", geometry.points.Select(p => new Point { x = p[0], y = p[1], z = p.Length > 2 ? p[2] : (double?)null }.ToKmlPoint(z, extraElements)))); }
/// <summary> /// Creates a new geometry from well-known text (WKT). /// </summary> /// <param name="wkt"></param> /// <returns></returns> public static Geometry ToGeometry(string wkt) { if (wkt == null) { return(null); } var s = wkt.ToUpperInvariant().Trim(); if (s.StartsWith("POINT")) { return(Point.FromWkt(wkt)); } if (s.StartsWith("MULTIPOINT")) { return(Multipoint.FromWkt(wkt)); } if (s.StartsWith("MULTILINESTRING")) { return(Polyline.FromWkt(wkt)); } if (s.StartsWith("MULTIPOLYGON")) { return(Polygon.FromWkt(wkt)); } throw new ArgumentException("This geometry type is not supported.", nameof(wkt)); }
/// <summary> /// Creates a new multipoint from well-known text (WKT). /// </summary> /// <param name="wkt"></param> /// <returns></returns> public static Multipoint FromWkt(string wkt) { if (wkt == null) { return(null); } var multipoint = new Multipoint(); multipoint.LoadWkt(wkt); return(multipoint); }
internal static string ToWkt(this Multipoint multipoint) { if (multipoint == null) { return(null); } if (multipoint.points == null || multipoint.points.Length == 0) { return("MULTIPOINT EMPTY"); } return($"MULTIPOINT({string.Join(",", multipoint.points.Select(p => $"({p[0]} {p[1]})"))})"); }
/// <summary> /// Creates a new multipoint from well-known text (WKT). /// </summary> /// <param name="wkt"></param> /// <returns></returns> public static Multipoint FromWkt(string wkt) { if (wkt == null) return null; var multipoint = new Multipoint(); multipoint.LoadWkt(wkt); return multipoint; }
internal static void LoadWkt(this Multipoint multipoint, string wkt) { var json = wkt.ToJson("MULTIPOINT"); multipoint.points = json == null ? new double[][] { } : json.Deserialize <double[][]>(); }
/// <summary> /// Determines if the multipoint is within the specified distance from the other multipoint. /// </summary> /// <param name="multipoint1"></param> /// <param name="multipoint2"></param> /// <param name="distance"></param> /// <returns></returns> public static bool WithinDistance(this Multipoint multipoint1, Multipoint multipoint2, double distance) { if (Null(multipoint1, multipoint2)) return false; return multipoint1.Extent().Buffer(distance).Intersects(multipoint2.Extent()) && multipoint1.Distance(multipoint2) < distance; }
/// <summary> /// Determines if the point is within the specified distance from the multipoint. /// </summary> /// <param name="point"></param> /// <param name="multipoint"></param> /// <param name="distance"></param> /// <returns></returns> public static bool WithinDistance(this Point point, Multipoint multipoint, double distance) { if (Null(point, multipoint)) return false; return point.Extent().Buffer(distance).Intersects(multipoint.Extent()) && point.Distance(multipoint) < distance; }
/// <summary> /// Determines if the polygon completely contains the multipoint. /// </summary> /// <param name="polygon"></param> /// <param name="multipoint"></param> /// <returns></returns> public static bool Contains(this Polygon polygon, Multipoint multipoint) { if (Null(polygon, multipoint)) return false; return polygon.Contains(multipoint.points); }
/// <summary> /// Calculates the shortest distance to the multipoint. /// </summary> /// <param name="polygon"></param> /// <param name="multipoint"></param> /// <returns></returns> public static double Distance(this Polygon polygon, Multipoint multipoint) { AssertNotNull(polygon, multipoint); return multipoint.Distance(polygon); }
/// <summary> /// Calculates the shortest distance to the multipoint. /// </summary> /// <param name="polyline"></param> /// <param name="multipoint"></param> /// <returns></returns> public static double Distance(this Polyline polyline, Multipoint multipoint) { AssertNotNull(polyline, multipoint); return multipoint.Distance(polyline); }
/// <summary> /// Calculates the distance to the other multipoint. /// </summary> /// <param name="multipoint1"></param> /// <param name="multipoint2"></param> /// <returns></returns> public static double Distance(this Multipoint multipoint1, Multipoint multipoint2) { AssertNotNull(multipoint1, multipoint2); if (multipoint1.Equals(multipoint2)) return 0; return multipoint1.points.SelectMany(p1 => multipoint2.points.Select(p2 => Length(p1, p2))).Min(); }
/// <summary> /// Calculates the shortest distance to the multipoint. /// </summary> /// <param name="point"></param> /// <param name="multipoint"></param> /// <returns></returns> public static double Distance(this Point point, Multipoint multipoint) { AssertNotNull(point, multipoint); return multipoint.points.Min(p => Length(new[] { point.x, point.y }, p)); }
/// <summary> /// Determines if the polygon is within the specified distance from the multipoint. /// </summary> /// <param name="polygon"></param> /// <param name="multipoint"></param> /// <param name="distance"></param> /// <returns></returns> public static bool WithinDistance(this Polygon polygon, Multipoint multipoint, double distance) { if (Null(polygon, multipoint)) return false; return multipoint.Distance(polygon) < distance; }