public static GisPoint ConvertToWgs84(GisPoint point) { NetTopologySuite.Geometries.PrecisionModel precisionModel = new NetTopologySuite.Geometries.PrecisionModel(GeoAPI.Geometries.PrecisionModels.Floating); CoordinateSystem wgs84 = GeographicCoordinateSystem.WGS84 as CoordinateSystem; CoordinateSystem mercatore = ProjectedCoordinateSystem.WebMercator as CoordinateSystem; ICoordinateSystemFactory cFac = new CoordinateSystemFactory(); int SRID_wgs84 = Convert.ToInt32(wgs84.AuthorityCode); //WGS84 SRID int SRID_mercatore = Convert.ToInt32(mercatore.AuthorityCode); //Mercatore SRID ProjNet.CoordinateSystems.Transformations.CoordinateTransformationFactory ctFact = new ProjNet.CoordinateSystems.Transformations.CoordinateTransformationFactory(); GeoAPI.CoordinateSystems.Transformations.ICoordinateTransformation transformation = ctFact.CreateFromCoordinateSystems(mercatore, wgs84); NetTopologySuite.Geometries.GeometryFactory factory_mercatore = new NetTopologySuite.Geometries.GeometryFactory(precisionModel, SRID_mercatore); var convertedPoint = factory_mercatore.CreatePoint(new GeoAPI.Geometries.Coordinate(point.X, point.Y, 0)); double[] coords = transformation.MathTransform.Transform(new double[] { convertedPoint.X, convertedPoint.Y }); NetTopologySuite.Geometries.GeometryFactory factory_wgs84 = new NetTopologySuite.Geometries.GeometryFactory(precisionModel, SRID_wgs84); var p1 = factory_wgs84.CreatePoint(new GeoAPI.Geometries.Coordinate(coords[0], coords[1])); return new GisPoint(p1.X, p1.Y); }
public static Extent ElementAsPolygon(XElement xparent) { string srsSname = AttributeAsString(xparent, "srsName"); var xcoordinates = xparent.Element(gml + "coordinates"); if (xcoordinates != null) { string value = xcoordinates.Value; var list = new List<GisPoint>(); string[] scoordses = value.Split(' '); foreach (var scoords in scoordses) { string[] coords = scoords.Split(','); double lon = StringAsDouble(coords[0], -1); double lat = StringAsDouble(coords[1], -1); var p = new GisPoint(lon, lat); list.Add(p); } double minX = Math.Min(list[0].X, list[1].X); double miny = Math.Min(list[0].Y, list[1].Y); double maxX = Math.Max(list[0].X, list[1].X); double maxy = Math.Max(list[0].Y, list[1].Y); return new Extent(minX, miny, maxX, maxy); } return null; }
public static List<GisPoint> StringAsCoordinates(string value) { var result = new List<GisPoint>(); string[] scoordses = value.Split(' '); foreach (var scoords in scoordses) { string[] coords = scoords.Split(','); double lon = Utilities.Parser.StringAsDouble(coords[0], -1); double lat = Utilities.Parser.StringAsDouble(coords[1], -1); var p = new GisPoint(lon, lat); p = ProjectionConversion.ConvertToWgs84(p); result.Add(p); } return result; }
/// <summary> /// Calculates center and zoom level given an extent. /// </summary> /// <param name="actualWidth">width of the map in screen coordinates</param> /// <param name="actualHeight">height of the map in screen coordinates</param> /// <param name="leftTop">Left top corner of the extent.</param> /// <param name="rightBottom">Right bottom corner of the extent</param> /// <param name="centerLocation">output center.</param> /// <param name="zoomlevel">output zoom level.</param> public static void CalculateCenterAndZoomByRectangle(double actualWidth, double actualHeight, GisPoint leftTop, GisPoint rightBottom, ref GisPoint centerLocation, out int zoomlevel) { centerLocation.Y = (leftTop.Y + rightBottom.Y) / 2; centerLocation.X = (leftTop.X + rightBottom.X) / 2; double tileSize = 256; double viewportWidth = (rightBottom.X - leftTop.X) / 360; double viewportHeight = (leftTop.Y - rightBottom.Y) / 180; if (viewportWidth / actualWidth < viewportHeight / actualHeight) { viewportWidth = viewportHeight; } zoomlevel = (int)Math.Log(actualWidth / tileSize / viewportWidth, 2d); }
/// <summary> /// Creates a new instance of the <see cref="GisShapePoint"/> /// </summary> public GisShapePoint(LayerVector ll) : base(ll) { _point = new GisPoint(); _point.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(_point_PropertyChanged); }
/// <summary> /// Returns a list of shapes contained in the passed GML string /// </summary> /// <param name="gml">GML string</param> /// <param name="layer">Layer where to load features</param> /// <param name="extent">extent of the shapes</param> /// <returns>List of shapes</returns> public static GisShapeCollection GetShapes(string gml, LayerVector layer, out Extent extent) { var res = new GisShapeCollection(); res.Name = layer.Name; var slayer = new List<string>(); foreach (LayerField t in layer.Fields) { slayer.Add(t.Name); } var provider = new SharpMap.GmlUtils.GmlProvider(gml, slayer); if (provider.Shapes == null) { extent = new Extent(provider.Extent.MinX,provider.Extent.MinY,provider.Extent.MaxX,provider.Extent.MaxY); return res; } for (int i = 0; i < provider.Shapes.Count; i++) { var shpOrig = provider.Shapes[i]; GisShapeBase shpDest = layer.CreateShape(); if (shpDest is GisShapePoint) { (shpDest as GisShapePoint).Point.X = (shpOrig.Geometry as Point).X; (shpDest as GisShapePoint).Point.Y = (shpOrig.Geometry as Point).Y; } else if (shpDest is GisShapeArc) { for (int j=0; j<(shpOrig.Geometry as LineString).Coordinates.Length; j++) { var p = new GisPoint(); p.X = (shpOrig.Geometry as LineString).Coordinates[j].X; p.Y = (shpOrig.Geometry as LineString).Coordinates[j].Y; (shpDest as GisShapeArc).Points.Add(p); } } else if (shpDest is GisShapeMultiPoint) { for (int j = 0; j < (shpOrig.Geometry as MultiPoint).Geometries.Length; j++) { var p = new GisPoint(); p.X = ((shpOrig.Geometry as MultiPoint).Geometries[j] as IPoint).X; p.Y = ((shpOrig.Geometry as MultiPoint).Geometries[j] as IPoint).Y; (shpDest as GisShapeMultiPoint).Points.Add(p); } } else if (shpDest is GisShapePolygon) { for (int j = 0; j < (shpOrig.Geometry as Polygon).ExteriorRing.Coordinates.Length; j++) { var p = new GisPoint(); p.X = (shpOrig.Geometry as Polygon).ExteriorRing.Coordinates[j].X; p.Y = (shpOrig.Geometry as Polygon).ExteriorRing.Coordinates[j].Y; (shpDest as GisShapePolygon).Points.Add(p); } } shpDest.UID = shpOrig.UID; shpDest.IsSelected = shpOrig.IsSelected; IEnumerable<string> keys = shpOrig.Keys; foreach(string key in keys) { shpDest[key] = shpOrig[key]; } if (shpDest != null) res.Add(shpDest); } if (provider.Extent != null) extent = new Extent(provider.Extent.MinX, provider.Extent.MinY, provider.Extent.MaxX, provider.Extent.MaxY); else extent = new Extent(); return res; }
/// <summary> /// Returns a list of features contained in the passed GML string /// </summary> /// <param name="gml">GML string</param> /// <param name="extent">extent of the shapes</param> /// <returns>List of features</returns> /// <remarks>Because the layer is not passed, all fields are treated as strings</remarks> public static GisShapeCollection GetShapes(string gml, out Extent extent) { var res = new GisShapeCollection(); res.Name = ""; var provider = new SharpMap.GmlUtils.GmlProvider(gml); if (provider.Shapes == null) { extent = new Extent(provider.Extent.MinX, provider.Extent.MinY, provider.Extent.MaxX, provider.Extent.MaxY); return res; } for (int i = 0; i < provider.Shapes.Count; i++) { var shpOrig = provider.Shapes[i]; GisShapeBase shpDest = null; if (shpOrig.Geometry is IPoint) { shpDest = CreateShape(GisShapeType.GisShapeTypePoint); (shpDest as GisShapePoint).Point.X = (shpOrig.Geometry as Point).X; (shpDest as GisShapePoint).Point.Y = (shpOrig.Geometry as Point).Y; } else if (shpOrig.Geometry is ILineString) { shpDest = CreateShape(GisShapeType.GisShapeTypeArc); for (int j = 0; j < (shpOrig.Geometry as LineString).Coordinates.Length; j++) { var p = new GisPoint(); p.X = (shpOrig.Geometry as LineString).Coordinates[j].X; p.Y = (shpOrig.Geometry as LineString).Coordinates[j].Y; (shpDest as GisShapeArc).Points.Add(p); } } else if (shpOrig.Geometry is IMultiPoint) { shpDest = CreateShape(GisShapeType.GisShapeTypeMultiPoint); for (int j = 0; j < (shpOrig.Geometry as MultiPoint).Geometries.Length; j++) { var p = new GisPoint(); p.X = ((shpOrig.Geometry as MultiPoint).Geometries[j] as IPoint).X; p.Y = ((shpOrig.Geometry as MultiPoint).Geometries[j] as IPoint).Y; (shpDest as GisShapeMultiPoint).Points.Add(p); } } else if (shpOrig.Geometry is IPolygon) { shpDest = CreateShape(GisShapeType.GisShapeTypePolygon); for (int j = 0; j < (shpOrig.Geometry as Polygon).ExteriorRing.Coordinates.Length; j++) { var p = new GisPoint(); p.X = (shpOrig.Geometry as Polygon).ExteriorRing.Coordinates[j].X; p.Y = (shpOrig.Geometry as Polygon).ExteriorRing.Coordinates[j].Y; (shpDest as GisShapePolygon).Points.Add(p); } } shpDest.UID = shpOrig.UID; shpDest.IsSelected = shpOrig.IsSelected; var keys = shpOrig.Keys; shpDest.PopulateTypes(keys); foreach (string key in keys) { shpDest[key] = shpOrig[key]; } if (shpDest != null) res.Add(shpDest); } if (provider.Extent != null) extent = new Extent(provider.Extent.MinX, provider.Extent.MinY, provider.Extent.MaxX, provider.Extent.MaxY); else extent = new Extent(); return res; }
private void InitDockLayout() { _mapForm = new ControlMapForm(); _mapForm.Text = "GIS地图"; _mapForm.Show(dockPanel1, DockState.Document); _mapForm.CloseButton = false; _mapForm.UiInitAndInvoke(); _mapForm.Activate(); MouseMoveOperator mouseMoveOperate; MouseDownOperator mouseDownOperate; sfHandle = new ShapeFileHandle(_mapForm.Map); #region 加载gis地图 string[] str = { @"D:\光纤传感监测系统\Monitor\Monitor\data\底图.shp", @"D:\光纤传感监测系统\Monitor\Monitor\data\省界WGS 84.shp", @"D:\光纤传感监测系统\Monitor\Monitor\data\海缆WGS 84.tif" }; mapLayer = new MapLayer(); MainLayerHandle = mapLayer.AddLayer(_mapForm.Map, str, "底图"); _mapForm.MainLayerHandle = MainLayerHandle; _mapForm.SetMainLayerHandle(); #endregion // _mapForm.Map.ZoomToMaxExtents(); _mapForm.Map.ZoomToLayer(MainLayerHandle); #region 在地图上划线 ClassLine line = new ClassLine(); ClassLine line_1 = new ClassLine(); GisPoint gisPoint = new GisPoint(); LineSet lineSet = new LineSet(tkMapColor.Yellow, 6.0f, tkDashStyle.dsSolid); LineSet lineSet_1 = new LineSet(tkMapColor.Red, 5.0f, tkDashStyle.dsCustom); gisPoint.connectToDB("Data Source=" + new DirectoryInfo("../../../../").FullName + "Monitor\\Monitor\\data\\data.db"); gisPoint.readData(); gisPoint.InitLineData(line); line_1.startX = gisPoint.m_PointList[15].X; line_1.startY = gisPoint.m_PointList[15].Y; line_1.endX = gisPoint.m_PointList[20].X; line_1.endY = gisPoint.m_PointList[20].Y; drawLine = new classDrawLine(_mapForm.Map); drawLine.WriteLine(line, lineSet); drawLine.WriteLine(line_1, lineSet_1); #endregion #region 在gis地图中添加ais数据 //1、获取数据库中数据 SqliteData sqlite = new SqliteData("Data Source=" + new DirectoryInfo("../../../../").FullName + "Monitor\\Monitor\\data\\data.db"); DataTable gisData = sqlite.readData("Point"); //2、实例化AISData类 ais = new AISData(_mapForm.Map, gisData); drawPoint_Ais = new classDrawPoint(MapForm.Map); //3、在地图上加载ais数据 pointSet = new PointSet("AisReal", tkDefaultPointSymbol.dpsTriangleUp, tkMapColor.Red, 16); drawPoint_Ais.CreatPoint(ais.point, pointSet); drawPoint_Ais.EditAttribute(); sfHandle.AddMouseMoveShapeFile("Ais", drawPoint_Ais.LayerHandle); #endregion #region drawPoint = new classDrawPoint(_mapForm.Map); var pnt = new ClassPoint(); pnt.x = 121.907567728461; pnt.y = 30.8729913928844; pnt.str = "图片详情"; string path = new DirectoryInfo("../../../../").FullName + "Monitor\\Monitor\\data\\ship3.png"; drawPoint.AddPicture(pnt, path); drawPoint.EditAttribute(); sfHandle.AddMouseDownShapeFile("pic", drawPoint.LayerHandle); #endregion _mapForm.Sf_MouseMove = sfHandle.Sf_MouseMove; _mapForm.Sf_MouseDown = sfHandle.Sf_MouseDown; mouseMoveOperate = new MouseMoveOperator(Operation.AddLabel); mouseDownOperate = new MouseDownOperator(Operation.AddLabel); //传入委托 MapForm.MouseMoveOperate = mouseMoveOperate; MapForm.mouseDownOperate = mouseDownOperate; //var point = new ClassPoint(); //point.x = 121.907567728461; //point.y = 30.8739913928844; //addText = new classAddText(_mapForm.Map, MainLayerHandle); //addText.AddText(point.x, point.y); }