private static Polyline CreatePolyline(string pointslist, bool toMercator) { PointCollection path = new PointCollection(); string[] coords = pointslist.Split(' '); MapPoint point = null; double lat, lon; for (int i = 0; i < coords.Length; i += 2) { lat = double.Parse(coords[i]); lon = double.Parse(coords[i + 1]); point = new MapPoint(lon, lat, new SpatialReference(4326)); path.Add((toMercator) ? point.GeographicToWebMercator() : point); } Polyline polyline = new Polyline(); if (path.Count > 0) { polyline.SpatialReference = path[0].SpatialReference; polyline.Paths.Add(path); } return(polyline); }
private static Polygon CreatePolygon(string exteriorPoints, string interiorPoints, bool toMercator) { PointCollection exPath = new PointCollection(); string[] exCoords = exteriorPoints.Split(' '); MapPoint point = null; double lat, lon; for (int i = 0; i < exCoords.Length; i += 2) { lat = double.Parse(exCoords[i]); lon = double.Parse(exCoords[i + 1]); point = new MapPoint(lon, lat, new SpatialReference(4326)); exPath.Add((toMercator) ? point.GeographicToWebMercator() : point); } Polygon polygon = new Polygon(); if (exPath.Count > 0) { polygon.SpatialReference = exPath[0].SpatialReference; polygon.Rings.Add(exPath); } if (!string.IsNullOrEmpty(interiorPoints)) { PointCollection inPath = new PointCollection(); string[] inCoords = interiorPoints.Split(' '); for (int i = 0; i < exCoords.Length; i += 2) { lat = double.Parse(exCoords[i]); lon = double.Parse(exCoords[i + 1]); point = new MapPoint(lon, lat, new SpatialReference(4326)); inPath.Add((toMercator) ? point.GeographicToWebMercator() : point); } polygon.Rings.Add(inPath); } return(polygon); }
public static MapPoint ParseW3CGeometry(List <XElement> geoElems, bool toMercator) { MapPoint point = null; double lat = -999.0, lon = -999.0; foreach (XElement elem in geoElems) { if (elem.Name.LocalName.ToLower() == "point") { foreach (XElement geoElem in elem.Elements()) { if (geoElem.Name.LocalName == "lat") { lat = double.Parse(geoElem.Value); } else if (geoElem.Name.LocalName == "long") { lon = double.Parse(geoElem.Value); } } } else if (elem.Name.LocalName == "lat") { lat = double.Parse(elem.Value); } else if (elem.Name.LocalName == "long") { lon = double.Parse(elem.Value); } if (lat > -999.0 && lon > -999.0) { point = new MapPoint(lon, lat, new SpatialReference(4326)); if (toMercator) { point = point.GeographicToWebMercator(); } } } return(point); }
/// <summary> /// Convert extent to Envelope between Mercator(102100) and Geographic(4326) spatial references /// If it is other spatial reference, use GeometryTool to project the envelope /// </summary> /// <param name="outSRWKID"></param> public Envelope ToEnvelope(int outSRWKID) { Envelope envelope = null; if (GeometryTool.IsWebMercatorSR(outSRWKID) && GeometryTool.IsGeographicSR(this.spatialReference)) { MapPoint mPoint1 = new MapPoint(this.xmin, this.ymin, new SpatialReference(4326)); MapPoint mPoint2 = new MapPoint(this.xmax, this.ymax, new SpatialReference(4326)); envelope = new Envelope(mPoint1.GeographicToWebMercator(), mPoint2.GeographicToWebMercator()); } else if (GeometryTool.IsWebMercatorSR(this.spatialReference) && GeometryTool.IsGeographicSR(outSRWKID)) { MapPoint mPoint1 = new MapPoint(this.xmin, this.ymin, new SpatialReference(this.spatialReference)); MapPoint mPoint2 = new MapPoint(this.xmax, this.ymax, new SpatialReference(this.spatialReference)); envelope = new Envelope(mPoint1.WebMercatorToGeographic(), mPoint2.WebMercatorToGeographic()); } else if (this.spatialReference == outSRWKID) { envelope = ToEnvelope(); } return(envelope); }
private Polygon CreateBufferCircle(MapPoint center, double radius, bool toMercator) { double pi36 = Math.PI / 180.0; double rx = radius, ry = radius; double dx = 1.0, dy = 1.0; ScaleLine.ScaleLineUnit units = UnitsHelper.GetUnitsByWKID(center.SpatialReference.WKID); if (units == ScaleLine.ScaleLineUnit.DecimalDegrees) { double[] conversion = UnitsHelper.GetConversionToDegree(center.Y, ScaleLine.ScaleLineUnit.Meters); rx = radius * conversion[0]; ry = radius * conversion[1]; } else { double conversion = UnitsHelper.GetConversionFromMeter(units); rx = radius * conversion; ry = radius * conversion; } PointCollection pointSet = new PointCollection(); for (int i = 0; i <= 36; i++) { dx = center.X + rx * Math.Cos(i * 10 * pi36); dy = center.Y + ry * Math.Sin(i * 10 * pi36); MapPoint p = new MapPoint(dx, dy, new SpatialReference(center.SpatialReference.WKID)); pointSet.Add((center.SpatialReference.WKID == 4326 && toMercator) ? p.GeographicToWebMercator() : p); } Polygon circle = new Polygon(); circle.Rings.Add(pointSet); circle.SpatialReference = new SpatialReference((center.SpatialReference.WKID == 4326 && toMercator) ? 102113 : center.SpatialReference.WKID); return(circle); }
public static Geometry ParseGeoRSSGeometry(XElement geoElem, bool toMercator) { Geometry geometry = null; string[] coords = { }; switch (geoElem.Name.LocalName) { case "box": coords = geoElem.Value.Trim().Split(' '); if (coords.Length == 2) { MapPoint point1 = new MapPoint(double.Parse(coords[1]), double.Parse(coords[0]), new SpatialReference(4326)); MapPoint point2 = new MapPoint(double.Parse(coords[3]), double.Parse(coords[2]), new SpatialReference(4326)); geometry = (toMercator) ? (new Envelope(point1.GeographicToWebMercator(), point2.GeographicToWebMercator())) : (new Envelope(point1, point2)); } break; case "point": coords = geoElem.Value.Trim().Split(' '); if (coords.Length == 2) { MapPoint point = new MapPoint(double.Parse(coords[1]), double.Parse(coords[0]), new SpatialReference(4326)); geometry = (toMercator) ? point.GeographicToWebMercator() : point; } break; case "line": geometry = CreatePolyline(geoElem.Value.Trim(), toMercator); break; case "polygon": geometry = CreatePolygon(geoElem.Value.Trim(), "", toMercator); break; case "where": string pointString = ""; XElement firstElem = (XElement)geoElem.FirstNode; if (firstElem.Name.NamespaceName.ToLower() == NS_GML) { switch (firstElem.Name.LocalName.ToLower()) { case "point": pointString = ((XElement)firstElem.FirstNode).Value.Trim(); coords = pointString.Split(' '); if (coords.Length == 2) { MapPoint point = new MapPoint(double.Parse(coords[1]), double.Parse(coords[0]), new SpatialReference(4326)); geometry = (toMercator) ? point.GeographicToWebMercator() : point; } break; case "envelope": pointString = ((XElement)firstElem.FirstNode).Value.Trim(); coords = pointString.Split(' '); MapPoint point1 = new MapPoint(double.Parse(coords[1]), double.Parse(coords[0]), new SpatialReference(4326)); pointString = ((XElement)firstElem.LastNode).Value.Trim(); coords = pointString.Split(' '); MapPoint point2 = new MapPoint(double.Parse(coords[1]), double.Parse(coords[0]), new SpatialReference(4326)); geometry = (toMercator) ? (new Envelope(point1.GeographicToWebMercator(), point2.GeographicToWebMercator())) : (new Envelope(point1, point2)); break; case "linestring": pointString = ((XElement)firstElem.FirstNode).Value.Trim(); geometry = CreatePolyline(pointString, toMercator); break; case "polygon": string exteriorPoints = ""; string interiorPoints = ""; foreach (XElement elem in firstElem.Elements()) { if (elem.Name.LocalName.ToLower() == "exterior") { exteriorPoints = ((XElement)((XElement)elem.FirstNode).FirstNode).Value; } if (elem.Name.LocalName.ToLower() == "interior") { interiorPoints = ((XElement)((XElement)elem.FirstNode).FirstNode).Value; } } geometry = CreatePolygon(exteriorPoints, interiorPoints, toMercator); break; } } break; } return(geometry); }