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);
        }
Exemple #2
0
        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;
        }
Exemple #3
0
        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;
        }
Exemple #8
0
        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);
        }