private GameObject NodeGameObject(GraphNodeContextData node)
    {
        var gameObject = new GameObject();

        gameObject.transform.position = node.Position;
        gameObject.transform.parent   = Root;

        var mesh = gameObject.AddComponent <MeshFilter>().mesh = new Mesh();

        gameObject.AddComponent <MeshRenderer>().material = Material;

        GeometryProvider.Build(
            mesh,
            new IcosahedronGeometryBuilder(),
            new GeometryBuilderSettings
        {
            Vertex = new GeometryBuilderVertexSettings
            {
                Scale    = node.Scale,
                Rotation = node.Rotation
            }
        });

        return(gameObject);
    }
示例#2
0
        private void Form2_Load(object sender, EventArgs e)
        {
            var tileLayer = new TileAsyncLayer(KnownTileSources.Create(KnownTileSource.BingRoadsStaging), "TileLayer");

            this.mapBox1.Map.BackgroundLayer.Add(tileLayer);
            GeometryFactory gf = new GeometryFactory(new PrecisionModel(), 3857);

            IMathTransform mathTransform = LayerTools.Wgs84toGoogleMercator.MathTransform;
            Envelope       geom          = GeometryTransform.TransformBox(
                new Envelope(-9.205626, -9.123736, 38.690993, 38.740837),
                mathTransform);

            //Adds a pushpin layer
            VectorLayer      pushPinLayer = new VectorLayer("PushPins");
            List <IGeometry> geos         = new List <IGeometry>();

            geos.Add(gf.CreatePoint(geom.Centre));
            GeometryProvider geoProvider = new GeometryProvider(geos);

            pushPinLayer.DataSource = geoProvider;
            //this.mapBox1.Map.Layers.Add(pushPinLayer);

            this.mapBox1.Map.ZoomToBox(geom);
            this.mapBox1.Map.Zoom = 8500;
            this.mapBox1.Refresh();
        }
示例#3
0
 /// <summary>
 /// 列选择
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void dataGridView1_RowHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
 {
     if (e.RowIndex < 0)
     {
         return;
     }
     dataGridView1.CurrentCell = dataGridView1.Rows[e.RowIndex].Cells[0];
     foreach (DataGridViewCell cell in dataGridView1.SelectedCells)
     {
         cell.Selected = false;
     }
     for (int i = 0; i < dataGridView1.ColumnCount; i++)
     {
         dataGridView1.Rows[e.RowIndex].Cells[i].Selected = true;
     }
     if (SelectObject != null)
     {
         decimal id  = 0;
         string  val = GetValue(dataGridView1, e.RowIndex, dataGridView1.ColumnCount - 1);
         if (decimal.TryParse(val, out id))
         {
             VectorLayer      vlayer     = GetCurrentLayer() as VectorLayer;
             GeometryProvider datasource = vlayer.DataSource as GeometryProvider;
             foreach (Geometry geom in _SelectObjects)
             {
                 if (geom.ID == id && datasource.Geometries.Contains(geom))
                 {
                     SelectObject(vlayer, geom);
                     break;
                 }
             }
         }
     }
 }
示例#4
0
文件: Form2.cs 项目: cugkgq/Project
        private void Form2_Load(object sender, EventArgs e)
        {
            //TileAsyncLayer osmLayer= new TileAsyncLayer(new OsmTileSource(), "TileLayer - OSM");
            TileAsyncLayer bingLayer = new TileAsyncLayer(new BingTileSource(BingRequest.UrlBing, "", BingMapType.Roads), "TileLayer - Bing");

            this.mapBox1.Map.BackgroundLayer.Add(bingLayer);
            GeometryFactory gf = new GeometryFactory(new PrecisionModel(), 3857);

#if DotSpatialProjections
            var mathTransform = LayerTools.Wgs84toGoogleMercator;
            var geom          = GeometryTransform.TransformBox(
                new Envelope(-9.205626, -9.123736, 38.690993, 38.740837),
                mathTransform.Source, mathTransform.Target);
#else
            IMathTransform mathTransform = LayerTools.Wgs84toGoogleMercator.MathTransform;
            Envelope       geom          = GeometryTransform.TransformBox(
                new Envelope(-9.205626, -9.123736, 38.690993, 38.740837),
                mathTransform);
#endif

            //Adds a pushpin layer
            VectorLayer      pushPinLayer = new VectorLayer("PushPins");
            List <IGeometry> geos         = new List <IGeometry>();
            geos.Add(gf.CreatePoint(geom.Centre));
            GeometryProvider geoProvider = new GeometryProvider(geos);
            pushPinLayer.DataSource = geoProvider;
            //this.mapBox1.Map.Layers.Add(pushPinLayer);

            this.mapBox1.Map.ZoomToBox(geom);
            this.mapBox1.Map.Zoom = 8500;
            this.mapBox1.Refresh();
        }
        private void AddAffectedAreaLayer(Map map, Polygon affectedArea)
        {
            var geoms = new List <IGeometry>()
            {
                affectedArea
            };

            if (!map.MapTransform.IsIdentity)
            {
                // affectedArea is aligned with Graphics Canvas (not with north arrow)
                // The following steps are simply to show this geom in world units
                var centreX = affectedArea.EnvelopeInternal.Centre.X;
                var centreY = affectedArea.EnvelopeInternal.Centre.Y;

                // apply negative rotation about center of polygon
                var rad   = NetTopologySuite.Utilities.Degrees.ToRadians(map.MapTransformRotation);
                var trans = new AffineTransformation();
                trans.Compose(AffineTransformation.TranslationInstance(-centreX, -centreY));
                trans.Compose(AffineTransformation.RotationInstance(-rad));

                var rotated = trans.Transform(affectedArea.Copy());

                // calculate enclosing envelope
                var minX = rotated.Coordinates.Min(c => c.X);
                var minY = rotated.Coordinates.Min(c => c.Y);
                var maxX = rotated.Coordinates.Max(c => c.X);
                var maxY = rotated.Coordinates.Max(c => c.Y);

                var coords = new Coordinate[]
                {
                    new Coordinate(minX, maxY),
                    new Coordinate(maxX, maxY),
                    new Coordinate(maxX, minY),
                    new Coordinate(minX, minY),
                    new Coordinate(minX, maxY),
                };

                // rotate enclosing envelope back to world units
                trans = new AffineTransformation();
                trans.Compose(AffineTransformation.RotationInstance(rad));
                trans.Compose(AffineTransformation.TranslationInstance(centreX, centreY));

                // construct geom to show on screen
                var enclosing = trans.Transform(new Polygon(new LinearRing(coords)));
                geoms.Add(enclosing);
            }

            var gp     = new GeometryProvider(geoms);
            var vLayer = new VectorLayer("Affected Area")
            {
                DataSource = gp,
                SRID       = map.SRID
            };

            vLayer.Style.Fill          = null;
            vLayer.Style.EnableOutline = true;
            //vLayer.Enabled = false;
            map.Layers.Add(vLayer);
        }
        /// <summary>
        /// 根据选择的元素和图层添加树结构
        /// </summary>
        private void AddTreeNode()
        {
            treeView1.Nodes.Clear();
            int index = 1;

            foreach (ILayer layer in SelectLayers)
            {
                if (!(layer is VectorLayer))
                {
                    continue;
                }
                VectorLayer vlayer = layer as VectorLayer;
                TreeNode    node   = new TreeNode(layer.LayerName);
                node.Tag = layer;
                treeView1.Nodes.Add(node);
                GeometryProvider datasource = vlayer.DataSource as GeometryProvider;
                foreach (Geometry geom in SelectObjects)
                {
                    if (datasource.Geometries.Contains(geom))
                    {
                        string txt = geom.Text.Trim();
                        if (txt == "")
                        {
                            txt = "未定义" + index;
                            index++;
                        }
                        TreeNode subnode = new TreeNode(txt);
                        subnode.Tag = geom;
                        node.Nodes.Add(subnode);
                    }
                }
            }
            for (int i = treeView1.Nodes.Count - 1; i >= 0; i--)
            {
                if (treeView1.Nodes[i].Nodes.Count <= 0)
                {
                    treeView1.Nodes.RemoveAt(i);
                }
            }
            if (treeView1.SelectedNode == null)
            {
                if (treeView1.Nodes.Count > 0)
                {
                    treeView1.SelectedNode = treeView1.Nodes[0].Nodes[0];
                }
            }
            if (treeView1.Nodes.Count <= 0)
            {
                dataGridView1.Rows.Clear();
                comboBox1.Items.Clear();
                textBox1.Text   = "";
                textBox2.Text   = "";
                textBox3.Text   = "";
                txtMessage.Text = "";
            }
        }
示例#7
0
        public void TestMapDecorationTest()
        {
            var m = new Map(new Size(780, 540))
            {
                BackColor = Color.White
            };
            var p   = new GeometryProvider(new List <IGeometry>());
            var pts = new [] { new GeoPoint(0, 0), new GeoPoint(779, 539) };
            var ls  = m.Factory.CreateLineString(pts);

            p.Geometries.Add(ls);
            m.Layers.Add(new VectorLayer("t", p));
            m.ZoomToExtents();

            m.Decorations.Add(new TestDecoration
            {
                Anchor          = MapDecorationAnchor.LeftTop,
                BorderColor     = Color.Green,
                BackgroundColor = Color.LightGreen,
                BorderWidth     = 2,
                Location        = new Point(10, 10),
                BorderMargin    = new Size(5, 5),
                RoundedEdges    = true,
                Opacity         = 0.6f
            });

            m.Decorations.Add(new TestDecoration
            {
                Anchor          = MapDecorationAnchor.RightTop,
                BorderColor     = Color.Red,
                BackgroundColor = Color.LightCoral,
                BorderWidth     = 2,
                Location        = new Point(10, 10),
                BorderMargin    = new Size(5, 5),
                RoundedEdges    = true,
                Opacity         = 0.2f
            });

            m.Decorations.Add(new ScaleBar
            {
                Anchor          = MapDecorationAnchor.Default,
                BorderColor     = Color.Blue,
                BackgroundColor = Color.CornflowerBlue,
                BorderWidth     = 2,
                Location        = new Point(10, 10),
                BorderMargin    = new Size(5, 5),
                RoundedEdges    = true,
                BarWidth        = 4,
                ScaleText       = ScaleBarLabelText.RepresentativeFraction,
                NumTicks        = 2,
                Opacity         = 1f
            });

            using (var bmp = m.GetMap())
                bmp.Save(System.IO.Path.Combine(UnitTestsFixture.GetImageDirectory(this), "TestMapDecorationTest.bmp"));
        }
示例#8
0
    void SetVectors()
    {
        GeometryProvider.Icosahedron(vectors, indices);
        sphereSpacing = scale * (float)timesToSubdivide;
        for (var i = 0; i < timesToSubdivide; i++)
        {
            GeometryProvider.Subdivide(vectors, indices, true);
        }
//		// commented Debug.Log("start, vectorsc:"+vectors.Count);
    }
        private void Dispose(bool disposing)
        {
            if (_isDisposed)
            {
                return;
            }

            if (disposing)
            {
                _provider = null;
            }
        }
示例#10
0
        /// <summary>
        /// 遍历地图中符合输入宗地名称的多边形,添加到列表中
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void AreaTipForm_Load(object sender, EventArgs e)
        {
            string    txt   = AreaName.ToLower();
            DataTable table = new DataTable();

            table.Columns.Add("areaname");
            table.Columns.Add("layer");
            List <Geometry>    geos   = new List <Geometry>();
            List <VectorLayer> layers = new List <VectorLayer>();

            for (int i = 0; i < Map.Layers.Count; i++)
            {
                if (Map.Layers[i] is VectorLayer)
                {
                    VectorLayer      layer    = Map.Layers[i] as VectorLayer;
                    GeometryProvider provider = (GeometryProvider)layer.DataSource;
                    //循环图层中的多边形
                    foreach (Geometry geom in provider.Geometries)
                    {
                        if (geom.Text.ToLower().Contains(txt))
                        {
                            table.Rows.Add(new object[] { geom.Text, layer.LayerName });
                            geos.Add(geom);
                            layers.Add(layer);
                        }
                    }
                }
            }
            myDataGridView1.DataSource = table;
            for (int i = 0; i < geos.Count; i++)
            {
                myDataGridView1.Rows[i].Cells[0].Tag = geos[i];
                myDataGridView1.Rows[i].Cells[1].Tag = layers[i];
            }
            geos.Clear();
            layers.Clear();
            //如果查询的数据多余1条,则按名称排序后,默认选中第一条
            if (myDataGridView1.RowCount > 0)
            {
                label1.Text = "记录数:" + myDataGridView1.RowCount;
                //myDataGridView1.Sort(myDataGridView1.Columns[0], ListSortDirection.Ascending);
                myDataGridView1.Rows[0].Selected = true;
            }
            //如果查询的数据只有1条或者没有查询到,则触发确定按钮
            if (myDataGridView1.RowCount <= 1)
            {
                if (myDataGridView1.RowCount == 1 && myDataGridView1.GetGridValue(0, 0).ToString() == AreaName ||
                    myDataGridView1.RowCount <= 0)
                {
                    btnOk_Click(null, null);
                }
            }
        }
示例#11
0
        private void AddItems(object sender, EventArgs e)
        {
            Random rndGen = new Random();
            Collection <Geometry> geometry = new Collection <Geometry>();

            VectorLayer layer = new VectorLayer(String.Empty);

            generatePoints(geometry, rndGen);
            layer.Style.Symbol = new Bitmap(@"Data\city.png");;
            layer.LayerName    = "Planes";
            GeometryProvider provider = new GeometryProvider(geometry);

            layer.DataSource = provider;
            mapWindow.MainMapImage.Map.Layers.Add(layer);
        }
示例#12
0
        private void addNewRandomGeometryLayer()
        {
            Random rndGen = new Random();
            Collection <IGeometry> geometry = new Collection <IGeometry>();

            VectorLayer layer = new VectorLayer(String.Empty);
            var         gf    = new GeometryFactory();

            switch (rndGen.Next(3))
            {
            case 0:
            {
                GeneratePoints(gf, geometry, rndGen);
                KeyValuePair <string, Bitmap> symbolEntry = getSymbolEntry(rndGen.Next(_symbolTable.Count));
                layer.Style.Symbol = symbolEntry.Value;
                layer.LayerName    = symbolEntry.Key;
            }
            break;

            case 1:
            {
                GenerateLines(gf, geometry, rndGen);
                KeyValuePair <string, Color> colorEntry = getColorEntry(rndGen.Next(_colorTable.Count));
                layer.Style.Line = new Pen(colorEntry.Value);
                layer.LayerName  = String.Format("{0} lines", colorEntry.Key);
            }
            break;

            case 2:
            {
                GeneratePolygons(gf, geometry, rndGen);
                KeyValuePair <string, Color> colorEntry = getColorEntry(rndGen.Next(_colorTable.Count));
                layer.Style.Fill = new SolidBrush(colorEntry.Value);
                layer.LayerName  = String.Format("{0} squares", colorEntry.Key);
            }
            break;

            default:
                throw new NotSupportedException();
            }

            var provider = new GeometryProvider(geometry);

            layer.DataSource = provider;

            addLayer(layer);
        }
示例#13
0
        /// <summary>
        /// 将序列化的数据转化为元素,并添加到图层中
        /// </summary>
        /// <param name="type"></param>
        /// <param name="data"></param>
        /// <param name="layer"></param>
        public static void Restore(string type, byte[] data, VectorLayer layer)
        {
            object obj = DeserializeObject(data);

            if (obj == null)
            {
                return;
            }
            GeometryProvider provider = (GeometryProvider)layer.DataSource;

            if (type == "GeoPoint")
            {
                GeoPoint point = (GeoPoint)obj;
                provider.Geometries.Add(point);
            }
            else if (type == "Point3D")
            {
                Point3D point3D = (Point3D)obj;
                provider.Geometries.Add(point3D);
            }
            else if (type == "Polygon")
            {
                Polygon polygon = (Polygon)obj;
                provider.Geometries.Add(polygon);
            }
            else if (type == "LineString")
            {
                LineString lineString = (LineString)obj;
                provider.Geometries.Add(lineString);
            }
            else if (type == "MultiLineString")
            {
                MultiLineString multiLineString = (MultiLineString)obj;
                provider.Geometries.Add(multiLineString);
            }
            else if (type == "MultiPoint")
            {
                MultiPoint multiPoint = (MultiPoint)obj;
                provider.Geometries.Add(multiPoint);
            }
            else if (type == "MultiPolygon")
            {
                MultiPolygon multiPolygon = (MultiPolygon)obj;
                provider.Geometries.Add(multiPolygon);
            }
        }
示例#14
0
        private void Form2_Load(object sender, EventArgs e)
        {
            var tileLayer = new TileAsyncLayer(KnownTileSources.Create(KnownTileSource.BingRoadsStaging, userAgent: TileLayerSample.DefaultUserAgent), "TileLayer");

            this.mapBox1.Map.BackgroundLayer.Add(tileLayer);
            GeometryFactory gf = new GeometryFactory(new PrecisionModel(), 3857);

            IMathTransform mathTransform = LayerTools.Wgs84toGoogleMercator.MathTransform;
            Envelope       geom          = GeometryTransform.TransformBox(
                new Envelope(-9.205626, -9.123736, 38.690993, 38.740837),
                mathTransform);

            //Adds a pushpin layer
            VectorLayer      pushPinLayer = new VectorLayer("PushPins");
            List <IGeometry> geos         = new List <IGeometry>();

            geos.Add(gf.CreatePoint(geom.Centre));
            GeometryProvider geoProvider = new GeometryProvider(geos);

            pushPinLayer.DataSource = geoProvider;
            //this.mapBox1.Map.Layers.Add(pushPinLayer);

            // ScaleBar
            this.mapBox1.Map.SRID = 3857;
            this.mapBox1.Map.Decorations.Add(
                new ScaleBar
            {
                Anchor  = MapDecorationAnchor.RightCenter,
                Enabled = chkScaleBar.Checked
            });

            // Graticule
            this.mapBox1.Map.Decorations.Add(new Graticule()
            {
                Enabled           = chkGraticule.Checked,
                PcsGraticuleMode  = PcsGraticuleMode.WebMercatorScaleLines,
                PcsGraticuleStyle =
                {
                    NumSubdivisions = 2
                }
            });

            this.mapBox1.Map.ZoomToBox(geom);
            this.mapBox1.Map.Zoom = 8500;
            this.mapBox1.Refresh();
        }
示例#15
0
    public void BuildSphere()
    {
        var vectors = new List <Vector3>();
        var indices = new List <int>();

        GeometryProvider.Icosahedron(vectors, indices);

        for (var i = 0; i < detailLevel; i++)
        {
            GeometryProvider.Subdivide(vectors, indices, true);
        }

        /// normalize vectors to "inflate" the icosahedron into a sphere.
        for (var i = 0; i < vectors.Count; i++)
        {
            vectors [i] = Vector3.Normalize(vectors [i]);
        }
    }
示例#16
0
        /// <summary>
        /// 保存图层中的元素
        /// </summary>
        /// <param name="layer"></param>
        public static void SaveObject(VectorLayer layer)
        {
            GeometryProvider provider = (GeometryProvider)layer.DataSource;

            foreach (Geometry geometry in provider.Geometries)
            {
                string type = string.Empty;
                if (geometry is GeoPoint)
                {
                    type = "GeoPoint";
                }
                else if (geometry is Point3D)
                {
                    type = "Point3D";
                }
                else if (geometry is Polygon)
                {
                    type = "Polygon";
                }
                else if (geometry is LineString)
                {
                    type = "LineString";
                }
                else if (geometry is MultiLineString)
                {
                    type = "MultiLineString";
                }
                else if (geometry is MultiPoint)
                {
                    type = "MultiPoint";
                }
                else if (geometry is MultiPolygon)
                {
                    type = "MultiPolygon";
                }
                else
                {
                    continue;
                }
                byte[] data = SerializeObject(geometry);
            }
        }
示例#17
0
        public void TestGeometryProvider()
        {
            string           wkt;
            GeometryServices g = new GeometryServices();
            GeometryProvider prov;

            IGeometry geom = g.DefaultGeometryFactory.WktReader.Read(File.ReadAllText("D:\\geometries.txt"));

            prov = new GeometryProvider(new[] { geom });


            using (IFeatureDataReader fdr =
                       prov.ExecuteFeatureQuery(new FeatureQueryExpression(geom.Extents, SpatialOperation.Intersects)))
            {
                while (fdr.Read())
                {
                    Debug.WriteLine(fdr.Geometry.AsText());
                }
            }
        }
示例#18
0
        /// <summary>
        /// 添加元素
        /// </summary>
        /// <param name="map"></param>
        /// <param name="tree"></param>
        /// <param name="cmd"></param>
        private void AddObject(MapImage map, MyTree tree, string[] cmd)
        {
            if (cmd.Length != 4)
            {
                return;
            }
            decimal  mapid     = GetId(cmd[1]);
            decimal  layerid   = GetId(cmd[2]);
            decimal  objectid  = GetId(cmd[3]);
            TreeNode layerNode = FindLayer(tree.Nodes[0], layerid);

            if (layerNode == null)
            {
                return;
            }
            if (!(layerNode.Tag is VectorLayer))
            {
                return;
            }
            VectorLayer layer = layerNode.Tag as VectorLayer;

            if (!(layer.DataSource is GeometryProvider))
            {
                return;
            }
            GeometryProvider      provider   = layer.DataSource as GeometryProvider;
            Collection <Geometry> geometries = provider.Geometries as Collection <Geometry>;
            //取得元素信息
            DataTable objecttable = MapDBClass.GetObjectById(mapid, layerid, objectid);

            for (int j = 0; j < objecttable.Rows.Count; j++)
            {
                byte[]   data     = (byte[])objecttable.Rows[j]["ObjectData"];
                Geometry geometry = (Geometry)Common.DeserializeObject(data);
                geometry.ID     = objectid;
                geometry.Select = false;
                geometries.Add(geometry);
                AddGeometryToTree(layerNode, geometry, geometry.Text);
            }
        }
示例#19
0
        /// <summary> Event handler for MouseDown event.  </summary>
        /// <param name="sender"> The sender of the MouseDown event. </param>
        /// <param name="e"> The event parameters. </param>
        #region doc:map_MouseDown handler
        private void map_MouseDown(object sender, MouseButtonEventArgs e)
        {
            if (!(e.ChangedButton == MouseButton.Left && e.ButtonState == MouseButtonState.Pressed))
            {
                return;
            }

            var canvasPoint = e.GetPosition(this);

            System.Windows.Point wgsPoint = CanvasToGeo(canvasPoint);
            var ds = new FeatureDataSet();

            geometries.Clear();
            using (var shpFile = new SharpMap.Data.Providers.ShapeFile(shapeFilePath))
            {
                shpFile.Open();
                shpFile.ExecuteIntersectionQuery(new BoundingBox(wgsPoint.X, wgsPoint.Y, wgsPoint.X, wgsPoint.Y), ds);

                //if selected any object
                if (ds.Tables[0].Rows.Count <= 0)
                {
                    return;
                }

                using (var geomProvider = new GeometryProvider(ds.Tables[0]))
                {
                    geomProvider.Open();
                    foreach (var geoItem in geomProvider.Geometries)
                    {
                        var geometry = WkbToWpf.Parse(geoItem.AsBinary(), GeoToCanvas);
                        if (geometry.FillContains(canvasPoint))
                        {
                            geometries.Add(geometry);
                        }
                    }
                }
            }
        }
示例#20
0
        private ILayer CreateLayer(string layerName, int sourceSrid, int targetSrid, Envelope viewExtents, Envelope crsDomain, Brush symColour, int symSize, double interval)
        {
            var gp = new GeometryProvider(Point.Empty);

            gp.SRID = sourceSrid;

            var originX = Math.Floor(viewExtents.MinX / interval) * interval;
            var originY = Math.Floor(viewExtents.MinY / interval) * interval;

            var coord = new Coordinate();

            var thisX = originX;

            while (thisX < viewExtents.MaxX)
            {
                var thisY = originY;
                while (thisY < viewExtents.MaxY)
                {
                    coord.X = thisX;
                    coord.Y = thisY;
                    if (crsDomain.Contains(coord))
                    {
                        gp.Geometries.Add(new Point(thisX, thisY));
                    }
                    thisY += interval;
                }
                thisX += interval;
            }

            var vl = new VectorLayer(layerName)
            {
                DataSource = gp,
                TargetSRID = targetSrid,
                Style      = { PointColor = symColour, PointSize = symSize }
            };

            return(vl);
        }
示例#21
0
        /// <summary>
        /// 添加图层
        /// </summary>
        /// <param name="map"></param>
        /// <param name="tree"></param>
        /// <param name="cmd"></param>
        private void AddLayer(MapImage map, MyTree tree, string[] cmd)
        {
            if (cmd.Length != 3)
            {
                return;
            }
            decimal mapid   = GetId(cmd[1]);
            decimal layerid = GetId(cmd[2]);
            //取得图层信息
            DataTable layertable = MapDBClass.GetLayerinfo(mapid, layerid);

            if (layertable == null || layertable.Rows.Count <= 0)
            {
                return;
            }
            string layername = layertable.Rows[0]["LayerName"].ToString();
            int    type      = 0;

            Int32.TryParse(layertable.Rows[0]["LayerType"].ToString(), out type);
            VectorLayer layer = new VectorLayer(layername, (VectorLayer.LayerType)type);

            layer.ID = layerid;
            layer.Style.EnableOutline = layertable.Rows[0]["EnableOutline"].ToString() == "1" ? true : false;
            layer.Style.Fill          = new SolidBrush(Color.FromArgb((int)layertable.Rows[0]["Fill"]));
            layer.Style.Line          = new Pen(Color.FromArgb((int)layertable.Rows[0]["Line"]), (int)layertable.Rows[0]["LineWidth"]);
            layer.Style.Outline       = new Pen(Color.FromArgb((int)layertable.Rows[0]["Outline"]), (int)layertable.Rows[0]["OutlineWidth"]);
            Collection <Geometry> geometries = new Collection <Geometry>();
            GeometryProvider      provider   = new GeometryProvider(geometries);

            layer.DataSource = provider;
            TreeNode node = new TreeNode(layername);

            node.Tag     = layer;
            node.Checked = true;
            if (SetLayerStyle != null)
            {
                SetLayerStyle(layer, layer.Style.Fill, layer.Style.Line, layer.Style.Outline, layer.Style.EnableOutline, node);
            }
            string layertext = "";

            switch (layer.Type)
            {
            case VectorLayer.LayerType.BaseLayer:
                layertext = Resources.BaseLayer;
                break;

            case VectorLayer.LayerType.PhotoLayer:
                layertext = Resources.PhotoLayer;
                break;

            case VectorLayer.LayerType.ReportLayer:
                layertext = Resources.ReportLayer;
                break;

            case VectorLayer.LayerType.MotionLayer:
                layertext = Resources.MotionPointLayer;
                break;

            case VectorLayer.LayerType.SaleLayer:
                layertext = Resources.SaleLayer;
                break;

            case VectorLayer.LayerType.AreaInformation:
                layertext = Resources.AreaInfoLayer;
                break;

            case VectorLayer.LayerType.Pricelayer:
                layertext = Resources.PriceLayer;
                break;

            case VectorLayer.LayerType.HireLayer:
                layertext = Resources.RentLayer;
                break;

            case VectorLayer.LayerType.OtherLayer:
                layertext = Resources.OtherLayer;
                break;
            }
            TreeNode mainnode = new TreeNode(layertext);

            mainnode.Checked = true;
            TreeNode findnode = FindNode(tree, layertext);

            if (findnode != null)
            {
                mainnode = findnode;
            }
            else if (layertext == Resources.BaseLayer)
            {
                if (tree.Nodes[0].Nodes.Count > 0)
                {
                    if (tree.Nodes[0].Nodes[0].Text == Resources.PhotoLayer)
                    {
                        tree.Nodes[0].Nodes.Insert(1, mainnode);
                    }
                    else
                    {
                        tree.Nodes[0].Nodes.Insert(0, mainnode);
                    }
                }
                else
                {
                    tree.Nodes[0].Nodes.Add(mainnode);
                }
            }
            else
            {
                findnode = FindNode(tree, Resources.DataLayer);
                if (findnode == null)
                {
                    findnode = new TreeNode(Resources.DataLayer);
                    tree.Nodes[0].Nodes.Add(findnode);
                }
                findnode.Nodes.Add(mainnode);
            }


            mainnode.Nodes.Add(node);
            map.Map.AddLayer(layer);
            //取得元素信息
            DataTable objecttable = MapDBClass.GetObject(mapid, layerid);

            for (int j = 0; j < objecttable.Rows.Count; j++)
            {
                decimal  objectid = (decimal)objecttable.Rows[j]["ObjectId"];
                byte[]   data     = (byte[])objecttable.Rows[j]["ObjectData"];
                Geometry geometry = (Geometry)Common.DeserializeObject(data);
                geometry.ID     = objectid;
                geometry.Select = false;
                geometries.Add(geometry);
                AddGeometryToTree(node, geometry, geometry.Text);
            }
        }
示例#22
0
        private void btnSelect_Click(object sender, EventArgs e)
        {
            dataGridView2.Rows.Clear();
            btnSelect.Checked                  = true;
            btnAll.Checked                     = false;
            全部显示ToolStripMenuItem.Checked      = false;
            仅显示选中元素数据ToolStripMenuItem.Checked = true;
            ILayer layer = GetCurrentLayer();

            if (layer is VectorLayer)
            {
                VectorLayer      vlayer     = layer as VectorLayer;
                GeometryProvider datasource = vlayer.DataSource as GeometryProvider;
                string           id         = "";
                foreach (Geometry geom in _SelectObjects)
                {
                    if (datasource.Geometries.Contains(geom))
                    {
                        id += geom.ID + ",";
                    }
                }

                //dataGridView1.Rows.Clear();
                dataGridView1.Columns.Clear();
                _PropertyType.Clear();
                _PropertyName.Clear();
                DataGridViewComboBoxColumn col = dataGridView2.Columns[0] as DataGridViewComboBoxColumn;
                col.Items.Clear();
                decimal layerid = GetCurrentLayerId();
                if (layerid < 0)
                {
                    dataGridView1_CurrentCellChanged(null, null);
                    return;
                }
                //取得真实属性表字段
                string    sql   = "select * from " + MapDBClass.GetPropertyTableName(MapId, layerid) + " where 1<>1";
                DataTable table = SqlHelper.Select(sql, null);
                for (int i = 4; i < table.Columns.Count; i++)
                {
                    string colname = table.Columns[i].ColumnName.ToLower();
                    string stype   = table.Columns[i].DataType.Name;
                    colname = table.Columns[i].ColumnName;
                    col.Items.Add(colname);
                    _PropertyType.Add(colname, stype);
                    _PropertyName.Add(colname);
                }
                col.Items.Add("日期");
                _PropertyType.Add("日期", "日期");
                dataGridView2.Rows.Clear();

                //取得条件
                string where = CreateWhere();
                //取得检索字段
                string select = CreateSelect(0);
                //取得表名
                string tablename = GetTableName();
                sql = select + "\r\n from \r\n" + tablename + where;
                if (id != "")
                {
                    sql += " and ObjectId in (" + id.Substring(0, id.Length - 1) + ")";
                }
                //查询
                table = SqlHelper.Select(sql, null);
                dataGridView1.DataSource = table;
            }
            dataGridView1_CurrentCellChanged(sender, e);
        }
 internal GeometryDataReader(GeometryProvider provider, BoundingBox bounds)
 {
     _provider = provider;
     _bounds = bounds;
 }
示例#24
0
        public void TestGeometryProvider()
        {
            string wkt;
            GeometryServices g = new GeometryServices();
            GeometryProvider prov;

            IGeometry geom = g.DefaultGeometryFactory.WktReader.Read(File.ReadAllText("D:\\geometries.txt"));

            prov = new GeometryProvider(new[] { geom });


            using (IFeatureDataReader fdr =
                prov.ExecuteFeatureQuery(new FeatureQueryExpression(geom.Extents, SpatialOperation.Intersects)))
            {
                while (fdr.Read())
                {
                    Debug.WriteLine(fdr.Geometry.AsText());
                }
            }
        }
示例#25
0
        public void Initial()
        {
            if (IsModify && ProjectData != null)
            {
                string sql = SqlHelper.GetSql("SelectProjectById");
                List <SqlParameter> param = new List <SqlParameter>();
                param.Add(new SqlParameter("area", ProjectData.Area));
                param.Add(new SqlParameter("date", ProjectData.Date));
                param.Add(new SqlParameter("MapId", _Map.MapId));
                DataTable table = SqlHelper.Select(sql, param);
                if (table == null || table.Rows.Count <= 0)
                {
                    return;
                }
                int year = DateTime.Now.Year;
                if (!int.TryParse(table.Rows[0]["date"].ToString(), out year))
                {
                    year = DateTime.Now.Year;
                }
                txtYear.Value = year;
                txtQuYu.Text  = table.Rows[0]["area"].ToString();

                areaList.Rows.Clear();
                if (table == null || table.Rows.Count <= 0)
                {
                    return;
                }
                for (int i = 0; i < table.Rows.Count; i++)
                {
                    int row = areaList.Rows.Add();
                    for (int j = 0; j < areaList.ColumnCount; j++)
                    {
                        for (int k = 0; k < table.Columns.Count; k++)
                        {
                            if (areaList.Columns[j].Name == table.Columns[k].ColumnName)
                            {
                                areaList.Rows[row].Cells[j].Value = table.Rows[i][k];
                                break;
                            }
                        }
                        areaList.Rows[row].Cells["OldLayerId"].Value  = table.Rows[i]["LayerId"];
                        areaList.Rows[row].Cells["OldObjectId"].Value = table.Rows[i]["ObjectId"];
                        areaList.Rows[row].Cells["modify"].Value      = "";
                    }
                }
                for (int i = 0; i < areaList.RowCount; i++)
                {
                    decimal layerid = (decimal)areaList.GetGridValue(i, "LayerId");
                    decimal objid   = (decimal)areaList.GetGridValue(i, "ObjectId");
                    foreach (ILayer layer in Map.Layers)
                    {
                        if (layer.ID == layerid && layer is VectorLayer)
                        {
                            GeometryProvider provider = (GeometryProvider)((VectorLayer)layer).DataSource;
                            foreach (Geometry geom in provider.Geometries)
                            {
                                if (geom.ID == objid)
                                {
                                    areaList.Rows[i].Cells["areaname"].Tag   = geom;
                                    areaList.Rows[i].Cells["areaname"].Value = geom.Text;
                                    break;
                                }
                            }
                            break;
                        }
                    }
                }
            }
            for (int row = 0; row < areaList.RowCount; row++)
            {
                string data = areaList.GetGridValue(row, "低效地类型").ToString();
                //areaList_CellValueInputed(areaList.Rows[row].Cells["低效地类型"], data);

                if (hash.ContainsKey(data))
                {
                    int index = (int)hash[data];
                    if (fields.Count > index && index >= 0)
                    {
                        for (int i = 0; i < areaList.ColumnCount; i++)
                        {
                            areaList.Rows[row].Cells[i].ReadOnly = true;
                        }
                        for (int i = 0; i < fields[index].Length; i++)
                        {
                            areaList.Rows[row].Cells[fields[index][i]].ReadOnly = false;
                        }
                    }
                }
            }
            _OldArea = txtQuYu.Text.Trim();
            _OldYear = (int)txtYear.Value;
            IsModify = false;
            areaList.Focus();
        }
示例#26
0
        private void txtQuYu_TextChanged(object sender, EventArgs e)
        {
            if (_OldArea == txtQuYu.Text.Trim() && (int)txtYear.Value == _OldYear)
            {
                return;
            }
            bool ismodify = _DeleteObject.Count > 0;

            if (!ismodify)
            {
                for (int i = 0; i < areaList.RowCount; i++)
                {
                    string flag = areaList.GetGridValue(i, "modify").ToString();
                    if (flag == "0" || flag == "1")
                    {
                        ismodify = true;
                        break;
                    }
                }
            }
            if (ismodify)
            {
                DialogResult ret = MessageBox.Show("数据已经被更改,是否需要保存更改的数据?", "提示", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1);
                if (ret == DialogResult.Cancel)
                {
                    return;
                }
                if (ret == DialogResult.Yes)
                {
                    btnOk_Click(null, null);
                    if (!_SaveSuccess)
                    {
                        txtQuYu.Text  = _OldArea;
                        txtYear.Value = _OldYear;
                        return;
                    }
                }
            }
            if (txtQuYu.Text.Trim() == "")
            {
                MessageBox.Show("请选择区域。");
                return;
            }
            _OldArea = txtQuYu.Text.Trim();
            _OldYear = (int)txtYear.Value;
            string sql = SqlHelper.GetSql("SelectProjectById");
            List <SqlParameter> param = new List <SqlParameter>();

            param.Add(new SqlParameter("area", txtQuYu.Text.Trim()));
            param.Add(new SqlParameter("date", txtYear.Value.ToString()));
            param.Add(new SqlParameter("MapId", _Map.MapId));
            DataTable table = SqlHelper.Select(sql, param);

            areaList.Rows.Clear();
            if (table == null || table.Rows.Count <= 0)
            {
                SetControlStatus();
                return;
            }

            for (int i = 0; i < table.Rows.Count; i++)
            {
                int row = areaList.Rows.Add();
                for (int j = 0; j < areaList.ColumnCount; j++)
                {
                    for (int k = 0; k < table.Columns.Count; k++)
                    {
                        if (areaList.Columns[j].Name == table.Columns[k].ColumnName)
                        {
                            areaList.Rows[row].Cells[j].Value = table.Rows[i][k];
                            break;
                        }
                    }
                    areaList.Rows[row].Cells["OldLayerId"].Value  = table.Rows[i]["LayerId"];
                    areaList.Rows[row].Cells["OldObjectId"].Value = table.Rows[i]["ObjectId"];
                    areaList.Rows[row].Cells["modify"].Value      = "";
                }
            }
            for (int i = 0; i < areaList.RowCount; i++)
            {
                decimal layerid = (decimal)areaList.GetGridValue(i, "LayerId");
                decimal objid   = (decimal)areaList.GetGridValue(i, "ObjectId");
                foreach (ILayer layer in Map.Layers)
                {
                    if (layer.ID == layerid && layer is VectorLayer)
                    {
                        GeometryProvider provider = (GeometryProvider)((VectorLayer)layer).DataSource;
                        foreach (Geometry geom in provider.Geometries)
                        {
                            if (geom.ID == objid)
                            {
                                areaList.Rows[i].Cells["areaname"].Tag   = geom;
                                areaList.Rows[i].Cells["areaname"].Value = geom.Text;
                                break;
                            }
                        }
                        break;
                    }
                }
            }


            for (int row = 0; row < areaList.RowCount; row++)
            {
                string data = areaList.GetGridValue(row, "低效地类型").ToString();
                //areaList_CellValueInputed(areaList.Rows[row].Cells["低效地类型"], data);

                if (hash.ContainsKey(data))
                {
                    int index = (int)hash[data];
                    if (fields.Count > index && index >= 0)
                    {
                        for (int i = 0; i < areaList.ColumnCount; i++)
                        {
                            areaList.Rows[row].Cells[i].ReadOnly = true;
                        }
                        for (int i = 0; i < fields[index].Length; i++)
                        {
                            areaList.Rows[row].Cells[fields[index][i]].ReadOnly = false;
                        }
                    }
                }
            }
            _OldArea = txtQuYu.Text.Trim();
            _OldYear = (int)txtYear.Value;
            IsModify = false;
            SetControlStatus();
        }
示例#27
0
 private void OnUpdatePrimitive()
 {
     GeometryProvider.Build(_mesh, _builder, _settings);
 }
示例#28
0
        private void ImageToWorld_Rotation(float deg)
        {
            var map = new Map(new Size(1000, 500))
            {
                BackColor = System.Drawing.Color.LightSkyBlue
            };

            map.Zoom   = 1000;
            map.Center = new Point(25000, 75000);
            double mapScale = map.GetMapScale(96);

            double scaleX = 1;
            double scaleY = 1;

            System.Drawing.Drawing2D.Matrix mapTransform = new System.Drawing.Drawing2D.Matrix();
            mapTransform.RotateAt(deg, new PointF(map.Size.Width / 2f, map.Size.Height / 2f));
            map.MapTransform = mapTransform;

            var env = map.Envelope;

            // Affine Transformation:
            // 1: Translate to mapViewPort centre
            // 2: Reflect in X-Axis
            // 3: Rotation about mapViewPort centre
            // 4: Scale to map units
            // 5: Translate to map centre

            //CLOCKWISE affine transform (negate degrees)
            //double rad = -1 * deg * Math.PI / 180.0;
            //GeoAPI.CoordinateSystems.Transformations.IMathTransform trans =
            //    new ProjNet.CoordinateSystems.Transformations.AffineTransform(
            //        scaleX * Math.Cos(rad),
            //        -scaleX * Math.Sin(rad),
            //        -scaleX * Math.Cos(rad) * map.Size.Width / 2f + scaleX * Math.Sin(rad) * map.Size.Height / 2f + map.Center.X,
            //        -scaleY * Math.Sin(rad),
            //        -scaleY * Math.Cos(rad),
            //        scaleY * Math.Sin(rad) * map.Size.Width / 2f + scaleY * Math.Cos(rad) * map.Size.Height / 2f + map.Center.Y);

            //ANTICLCOCKWISE affine transform
            double rad = deg * Math.PI / 180.0;

            GeoAPI.CoordinateSystems.Transformations.IMathTransform trans =
                new ProjNet.CoordinateSystems.Transformations.AffineTransform(
                    scaleX * Math.Cos(rad),
                    scaleX * Math.Sin(rad),
                    -scaleX * Math.Cos(rad) * map.Size.Width / 2d - scaleX * Math.Sin(rad) * map.Size.Height / 2d + map.Center.X,
                    scaleY * Math.Sin(rad),
                    -scaleY * Math.Cos(rad),
                    -scaleY * Math.Sin(rad) * map.Size.Width / 2d + scaleY * Math.Cos(rad) * map.Size.Height / 2d + map.Center.Y);

            // image coordindates
            var pts = new[] { new Point(map.Size.Width / 2f, map.Size.Height / 2f),     // centre
                              new Point(0, 0),                                          // UL
                              new Point(map.Size.Width, 0),                             // UR
                              new Point(map.Size.Width, map.Size.Height),               // LR
                              new Point(0, map.Size.Height),                            // LL
                              new Point(map.Size.Width * 0.05, map.Size.Height * 0.95), // LL inset 5%
                              new Point(map.Size.Width * 0.95, map.Size.Height * 0.95), // LR inset 5%
                              new Point(map.Size.Width * 0.95, map.Size.Height * 0.05), // UR inset 5%
                              new Point(map.Size.Width * 0.05, map.Size.Height * 0.05)  // UL inset 5%
            };

            LineString lineString = new LineString(pts);

            NetTopologySuite.CoordinateSystems.Transformations.GeometryTransform.TransformLineString(new GeometryFactory(new PrecisionModel()), lineString, trans);

            // .Net Matrix
            //System.Drawing.Drawing2D.Matrix matrix;
            //matrix = new System.Drawing.Drawing2D.Matrix();
            //matrix.Translate(-map.Size.Width / 2f, -map.Size.Height / 2f);      // shift origin to viewport centre
            //matrix.Scale(1, -1, System.Drawing.Drawing2D.MatrixOrder.Append);   // reflect in X axis
            //matrix.Rotate(deg, System.Drawing.Drawing2D.MatrixOrder.Append);    // rotate about viewport centre
            //matrix.Scale((float)scaleX, (float)scaleY, System.Drawing.Drawing2D.MatrixOrder.Append); // scale
            //matrix.Translate((float)map.Center.X, (float)map.Center.Y, System.Drawing.Drawing2D.MatrixOrder.Append); // translate to map centre

            //var ptsF = new[] { new PointF(map.Size.Width / 2f, map.Size.Height / 2f), // centre
            //                new PointF(0, 0),                            // UL
            //                new PointF(map.Size.Width, 0),               // UR
            //                new PointF(map.Size.Width, map.Size.Height), // LR
            //                new PointF(0, map.Size.Height) };            // LL

            //matrix.TransformPoints(ptsF);

            // validate ImageToWorld calcs with independent affine transformation
            Assert.IsTrue(lineString.GetPointN(0).Coordinate.Equals2D(map.ImageToWorld(new PointF(map.Size.Width / 2f, map.Size.Height / 2f), true), 0.001), "Centre: " + deg + " deg");
            Assert.IsTrue(lineString.GetPointN(1).Coordinate.Equals2D(map.ImageToWorld(new PointF(0, 0), true), 0.001), "Upper Left: " + deg + " deg");
            Assert.IsTrue(lineString.GetPointN(2).Coordinate.Equals2D(map.ImageToWorld(new PointF(map.Size.Width, 0), true), 0.001), "Upper Right: " + deg + " deg");
            Assert.IsTrue(lineString.GetPointN(3).Coordinate.Equals2D(map.ImageToWorld(new PointF(map.Size.Width, map.Size.Height), true), 0.001), "Lower Right: " + deg + " deg");
            Assert.IsTrue(lineString.GetPointN(4).Coordinate.Equals2D(map.ImageToWorld(new PointF(0, map.Size.Height), true), 0.001), "Lower Left: " + deg + " deg");

            // validate map envelope: lineString outline = image extents, so lineString.EnvelopeInternal should equal map.Envelope
            // this test found long-standing bug in Map.Envelope calcs
            Assert.IsTrue(env.BottomLeft().Equals2D(lineString.EnvelopeInternal.BottomLeft(), 0.1));
            Assert.IsTrue(env.TopLeft().Equals2D(lineString.EnvelopeInternal.TopLeft(), 0.1));
            Assert.IsTrue(env.TopRight().Equals2D(lineString.EnvelopeInternal.TopRight(), 0.1));
            Assert.IsTrue(env.BottomRight().Equals2D(lineString.EnvelopeInternal.BottomRight(), 0.1));

            // visual checks
            var vl = new VectorLayer("Test Points");
            var gp = new GeometryProvider(lineString);

            gp.Geometries.Add(new NetTopologySuite.Geometries.Point(25000, 75000));
            vl.DataSource = gp;
            var cps = new SharpMap.Rendering.Symbolizer.CharacterPointSymbolizer();

            cps.CharacterIndex       = 221;
            cps.Font                 = new Font("Wingdings", 30);
            vl.Style.PointSymbolizer = cps;
            map.Layers.Add(vl);

            map.ZoomToBox(lineString.EnvelopeInternal);

            string fn = $"MapRotation_{deg:000}_{map.Zoom:0}_{map.MapScale:0}.bmp";

            using (var img = map.GetMap(96))
                img.Save(fn, System.Drawing.Imaging.ImageFormat.Bmp);

            map.Dispose();
        }
示例#29
0
        protected override void OnMouseDown(MouseEventArgs e)
        {
            base.OnMouseDown(e);
            if (e.Button == MouseButtons.Right)
            {
                if (!_DrawEnd)
                {
                    if (MainMapImage.ActiveTool == MapImage.Tools.MeasureArea ||
                        MainMapImage.ActiveTool == MapImage.Tools.DefineArea ||
                        MainMapImage.ActiveTool == MapImage.Tools.SelectPoint ||
                        MainMapImage.ActiveTool == MapImage.Tools.ZoomArea)
                    {
                        if (MainMapImage.ActiveTool == MapImage.Tools.ZoomArea)
                        {
                            this.Visible = false;
                            if (AfterDefineArea != null)
                            {
                                AfterDefineArea(SelectionType, null, _R);
                            }
                            return;
                        }
                        if (marea.ExteriorRing.Vertices.Count > 0)
                        {
                            marea.ExteriorRing.Vertices.RemoveAt(marea.ExteriorRing.Vertices.Count - 1);
                        }
                        else
                        {
                            this.Visible = false;
                            if (AfterDefineArea != null)
                            {
                                AfterDefineArea(SelectionType, null, _R);
                            }
                            return;
                        }
                        if (MainMapImage.ActiveTool == MapImage.Tools.MeasureArea)
                        {
                            if (SetArea != null)
                            {
                                SetArea(marea.Area);
                            }
                        }
                        else if (MainMapImage.ActiveTool == MapImage.Tools.DefineArea ||
                                 MainMapImage.ActiveTool == MapImage.Tools.SelectPoint)
                        {
                            Refresh();

                            Polygon newArea = null;
                            string  text    = null;
                            if (MainMapImage.ActiveTool == MapImage.Tools.DefineArea)
                            {
                                InputStringForm form = new InputStringForm("请输入区域名称:", "");

                                if (form.ShowDialog() == DialogResult.OK)
                                {
                                    //text = form.InputContext;
                                    marea.Text = form.InputContext;
                                }
                                else
                                {
                                    this.Visible = false;
                                    if (AfterDefineArea != null)
                                    {
                                        AfterDefineArea(SelectionType, null, _R);
                                    }
                                    return;
                                }
                                //取得当前图层
                                VectorLayer layer = (VectorLayer)MainMapImage.Map.CurrentLayer;
                                //取得图层数据源
                                GeometryProvider provider = (GeometryProvider)layer.DataSource;
                                //添加当前定义的多边形
                                newArea      = marea.Clone();
                                newArea.Text = marea.Text;
                                newArea.ID   = marea.ID;
                                provider.Geometries.Add(newArea);
                                //强制地图刷新
                                MainMapImage.Refresh();
                            }
                            if (AfterDefineArea != null)
                            {
                                AfterDefineArea(SelectionType, marea, _R);
                            }
                            if (newArea != null)
                            {
                                newArea.ID = marea.ID;
                            }
                            //重新初始化多边形
                            marea        = new Polygon();
                            this.Visible = false;
                        }
                    }

                    else if (MainMapImage.ActiveTool == MapImage.Tools.MeasureLength)
                    {
                        mline.Vertices.RemoveAt(mline.Vertices.Count - 1);
                        //设置测量窗口的信息
                        if (SetLength != null)
                        {
                            SetLength(mline.Length, mline.Length - oldlength);
                        }
                    }
                    Refresh();
                    _DrawEnd = true;
                }
            }
            if (e.Button == MouseButtons.Left)
            {
                if (_DrawEnd)
                {
                    Initial(SelectionType);
                }
                _DrawEnd = false;
                //将图像坐标转化为地图坐标
                EasyMap.Geometries.Point WorldPos = MainMapImage.Map.ImageToWorld(new System.Drawing.Point(e.X, e.Y));
                //保存上一次的长度,以便计算出最后一段直线的长度
                oldlength = mline.Length;
                if (SelectionType == SELECTION_TYPE.CIRCLETEMP)
                {
                    //添加救援点
                    //double radius = 10;
                    //double deltaDegrees = 2;
                    //double deltaRadians = (Math.PI / 180) * deltaDegrees;
                    EasyMap.Geometries.Point marea = new Geometries.Point();
                    marea = new EasyMap.Geometries.Point(WorldPos.X, WorldPos.Y);
                    EasyMap.Geometries.Point newArea = new Geometries.Point();
                    //string text = null;
                    if (MainMapImage.ActiveTool == MapImage.Tools.DefineArea)
                    {
                        InputStringForm form = new InputStringForm("请输入救援力量名称:", "");

                        if (form.ShowDialog() == DialogResult.OK)
                        {
                            //text = form.InputContext;
                            marea.Text = form.InputContext;
                        }
                        else
                        {
                            this.Visible = false;
                            if (AfterDefineArea1 != null)
                            {
                                AfterDefineArea1(SelectionType, null, _R);
                            }
                            return;
                        }
                        //取得当前图层
                        VectorLayer layer = (VectorLayer)MainMapImage.Map.CurrentLayer;
                        //取得图层数据源
                        GeometryProvider provider = (GeometryProvider)layer.DataSource;
                        //添加当前定义的多边形
                        marea.ID     = MapDBClass.GetObjectId(MainMapImage.Map.MapId, layer.ID);
                        newArea      = marea.Clone();
                        newArea.Text = marea.Text;
                        newArea.ID   = marea.ID;
                        provider.Geometries.Add(newArea);

                        //强制地图刷新
                        MainMapImage.Refresh();
                    }

                    if (AfterDefineArea1 != null)
                    {
                        AfterDefineArea1(SelectionType, marea, _R);
                    }
                    //强制地图刷新
                    MainMapImage.Refresh(); newArea.ID = marea.ID;
                    //重新初始化多边形
                    //marea = new Polygon();
                    marea        = new Geometries.Point();
                    this.Visible = false;
                    ////强制地图刷新
                    MainMapImage.Refresh();
                }
                else if (SelectionType == SELECTION_TYPE.PROBLEMPOINT)
                {
                    EasyMap.Geometries.Point marea = new Geometries.Point();
                    marea = new EasyMap.Geometries.Point(WorldPos.X, WorldPos.Y);
                    EasyMap.Geometries.Point newArea = new Geometries.Point();
                    if (MainMapImage.ActiveTool == MapImage.Tools.DefineArea)
                    {
                        InputStringForm form = new InputStringForm("请输入遇难点名称:", "");

                        if (form.ShowDialog() == DialogResult.OK)
                        {
                            //text = form.InputContext;
                            marea.Text = form.InputContext;
                        }
                        else
                        {
                            this.Visible = false;
                            if (AfterDefineArea1 != null)
                            {
                                AfterDefineArea1(SelectionType, null, _R);
                            }
                            return;
                        }
                        //取得当前图层
                        VectorLayer layer = (VectorLayer)MainMapImage.Map.CurrentLayer;
                        //取得图层数据源
                        GeometryProvider provider = (GeometryProvider)layer.DataSource;
                        marea.ID = MapDBClass.GetObjectId(MainMapImage.Map.MapId, layer.ID);
                        //添加当前定义的多边形
                        newArea      = marea.Clone();
                        newArea.Text = marea.Text;
                        newArea.ID   = marea.ID;
                        provider.Geometries.Add(newArea);

                        //强制地图刷新
                        MainMapImage.Refresh();
                    }

                    if (AfterDefineArea1 != null)
                    {
                        AfterDefineArea1(SelectionType, marea, _R);
                    }
                    //强制地图刷新
                    MainMapImage.Refresh();
                    newArea.ID   = marea.ID;
                    marea        = new Geometries.Point();
                    this.Visible = false;
                    ////强制地图刷新
                    MainMapImage.Refresh();
                }
                else if (SelectionType == SELECTION_TYPE.RECTANGLE ||
                         SelectionType == SELECTION_TYPE.CIRCLE)
                {
                    marea.ExteriorRing.Vertices.Add(WorldPos);
                    marea.ExteriorRing.Vertices.Add(new EasyMap.Geometries.Point(WorldPos.X, WorldPos.Y));
                    if (marea.ExteriorRing.Vertices.Count > 2)
                    {
                        _DrawEnd     = true;
                        this.Visible = false;
                        if (SelectionType == SELECTION_TYPE.RECTANGLE)
                        {
                            double x1 = marea.ExteriorRing.Vertices[0].X;
                            double y1 = marea.ExteriorRing.Vertices[0].Y;
                            double x3 = marea.ExteriorRing.Vertices[1].X;
                            double y3 = marea.ExteriorRing.Vertices[1].Y;
                            double x2 = x1;
                            double y2 = y3;
                            double x4 = x3;
                            double y4 = y1;
                            marea.ExteriorRing.Vertices.Clear();
                            marea.ExteriorRing.Vertices.Add(new EasyMap.Geometries.Point(x1, y1));
                            marea.ExteriorRing.Vertices.Add(new EasyMap.Geometries.Point(x2, y2));
                            marea.ExteriorRing.Vertices.Add(new EasyMap.Geometries.Point(x3, y3));
                            marea.ExteriorRing.Vertices.Add(new EasyMap.Geometries.Point(x4, y4));
                        }
                        if (AfterDefineArea != null)
                        {
                            AfterDefineArea(SelectionType, marea, _R);
                        }
                        //Polygon newArea = null;
                        //if (SelectionType == SELECTION_TYPE.CIRCLE)
                        //{
                        //    InputStringForm form = new InputStringForm("请输入区域名称:", "");

                        //    if (form.ShowDialog() == DialogResult.OK)
                        //    {
                        //        //text = form.InputContext;
                        //        marea.Text = form.InputContext;
                        //    }
                        //    else
                        //    {
                        //        this.Visible = false;
                        //        if (AfterDefineArea != null)
                        //        {
                        //            AfterDefineArea(SelectionType, null, _R);
                        //        }
                        //        return;
                        //    }
                        //    //取得当前图层
                        //    VectorLayer layer = (VectorLayer)MainMapImage.Map.CurrentLayer;
                        //    //取得图层数据源
                        //    GeometryProvider provider = (GeometryProvider)layer.DataSource;
                        //    //添加当前定义的多边形
                        //    newArea = marea.Clone();
                        //    newArea.Text = "";
                        //    newArea.ID = marea.ID;
                        //    provider.Geometries.Add(newArea);
                        //    //强制地图刷新
                        //    MainMapImage.Refresh();
                        //}
                        return;
                    }
                }
                else if (SelectionType == SELECTION_TYPE.CIRCLE_RADIO)
                {
                    marea.ExteriorRing.Vertices.Add(WorldPos);
                    XYInputForm form = new XYInputForm();
                    form.txtX.Enabled = false;
                    form.txtY.Enabled = false;
                    form.XX           = marea.ExteriorRing.Vertices[0].X;
                    form.YY           = marea.ExteriorRing.Vertices[0].Y;
                    if (form.ShowDialog() == DialogResult.OK)
                    {
                        marea.ExteriorRing.Vertices.Add(WorldPos);
                        marea.ExteriorRing.Vertices.Add(WorldPos);
                        _R = (float)form.R;
                        if (AfterDefineArea != null)
                        {
                            AfterDefineArea(SelectionType, marea, _R);
                        }
                    }
                    _DrawEnd     = true;
                    this.Visible = false;
                    return;
                }
                //如果是测量长度
                else if (MainMapImage.ActiveTool == MapImage.Tools.MeasureLength)
                {
                    //添加地图坐标
                    mline.Vertices.Add(WorldPos);
                    //如果是第一次添加,那么需要追加一个点,以便在鼠标移动的时候更改这个点
                    if (mline.Vertices.Count < 2)
                    {
                        mline.Vertices.Add(new EasyMap.Geometries.Point(WorldPos.X, WorldPos.Y));
                    }
                }
                //如果是测量面积
                else if (MainMapImage.ActiveTool == MapImage.Tools.MeasureArea ||
                         MainMapImage.ActiveTool == MapImage.Tools.DefineArea ||
                         MainMapImage.ActiveTool == MapImage.Tools.SelectPoint ||
                         MainMapImage.ActiveTool == MapImage.Tools.ZoomArea ||
                         SelectionType == SELECTION_TYPE.POLYGON)
                {
                    if (MainMapImage.ActiveTool == MapImage.Tools.ZoomArea &&
                        marea.ExteriorRing.Vertices.Count == 2)
                    {
                        this.Visible = false;
                        if (AfterDefineArea != null)
                        {
                            AfterDefineArea(SelectionType, marea, _R);
                        }
                        return;
                    }
                    //添加地图坐标
                    marea.ExteriorRing.Vertices.Add(WorldPos);
                    //如果是第一次添加,那么需要追加一个点,以便在鼠标移动的时候更改这个点
                    if (marea.ExteriorRing.Vertices.Count < 2)
                    {
                        marea.ExteriorRing.Vertices.Add(new EasyMap.Geometries.Point(WorldPos.X, WorldPos.Y));
                    }
                }
            }
        }
        /// <summary>
        /// 生成查询SQL
        /// </summary>
        /// <returns></returns>
        private string MakeSql(MyDataGridView view)
        {
            string sql = "";

            view.DataSource = null;
            view.Columns.Clear();
            DataGridViewTextBoxColumn c = new DataGridViewTextBoxColumn();

            c.DataPropertyName = "layerid";
            c.Visible          = false;
            view.Columns.Add(c);
            c = new DataGridViewTextBoxColumn();
            c.DataPropertyName = "objectid";
            c.Visible          = false;
            view.Columns.Add(c);
            c = new DataGridViewTextBoxColumn();
            c.DataPropertyName = "区域名称";
            c.HeaderText       = "区域名称";
            view.Columns.Add(c);
            foreach (TreeNode node in geomTree.Nodes)
            {
                ILayer layer = node.Tag as ILayer;
                int    row   = view.Rows.Add();
                foreach (TreeNode subnode in node.Nodes)
                {
                    if (subnode.Checked)
                    {
                        int col = -1;
                        for (int i = 0; i < view.RowCount; i++)
                        {
                            for (int j = 0; j < view.ColumnCount; j++)
                            {
                                if (view.GetGridValue(i, j).ToString() == subnode.Text)
                                {
                                    col = j;
                                    break;
                                }
                            }
                            if (col >= 0)
                            {
                                break;
                            }
                        }
                        if (col < 0)
                        {
                            DataGridViewTextBoxColumn column = new DataGridViewTextBoxColumn();
                            column.DataPropertyName = subnode.Text;
                            column.Tag        = "[" + subnode.Text + "]";
                            column.HeaderText = subnode.Text;
                            col = view.Columns.Add(column);
                        }
                        view.Rows[row].Cells[col].Value = subnode.Text;
                        view.Rows[row].Cells[col].Tag   = "[" + GetTableName(layer) + "].[" + subnode.Text + "]";
                    }
                }
            }
            int index = 0;

            foreach (TreeNode node in geomTree.Nodes)
            {
                bool find = false;
                foreach (TreeNode subnode in node.Nodes)
                {
                    if (subnode.Checked)
                    {
                        find = true;
                        break;
                    }
                }
                if (find)
                {
                    string      subsql = "";
                    VectorLayer layer  = node.Tag as VectorLayer;
                    for (int i = 3; i < view.ColumnCount; i++)
                    {
                        if (subsql != "")
                        {
                            subsql += ",";
                        }
                        if (view.Rows[index].Cells[i].Tag != null)
                        {
                            subsql += view.Rows[index].Cells[i].Tag.ToString() + " as " + view.Columns[i].Tag.ToString();
                        }
                        else
                        {
                            subsql += "NULL as " + view.Columns[i].Tag.ToString();
                        }
                    }
                    if (subsql != "")
                    {
                        string tablename = GetTableName(layer);
                        subsql = "select " + tablename + ".layerid," + tablename + ".objectid,isnull(t_object.name,'') as 区域名称," + subsql + " from " + tablename;
                        //subsql += " and propertydate='" + dateTimePicker1.Value.ToShortDateString() + "'";
                        GeometryProvider datasource = layer.DataSource as GeometryProvider;
                        string           values     = "";
                        foreach (Geometry geom in _ObjectsId)
                        {
                            if (datasource.Geometries.Contains(geom))
                            {
                                if (values != "")
                                {
                                    values += ",";
                                }
                                values += geom.ID;
                            }
                        }
                        if (radioButton2.Checked)
                        {
                            subsql += " left join t_object on ";
                            subsql += tablename + ".mapid=t_object.mapid ";
                            subsql += " and " + tablename + ".layerid=t_object.layerid ";
                            subsql += " and " + tablename + ".objectid=t_object.objectid ";
                            subsql += " where " + tablename + ".mapid=" + _MapId;
                            subsql += " and " + tablename + ".layerid=" + layer.ID;
                            string sdate = Common.ConvertDateToString(dateTimePicker1.Value);
                            subsql += " and " + tablename + ".propertydate='" + sdate + "'";
                            if (values != "")
                            {
                                subsql += " and " + tablename + ".objectid in (" + values + ")";
                            }
                            else
                            {
                                subsql = "";
                            }
                        }
                        else
                        {
                            subsql += " left join t_object on ";
                            subsql += tablename + ".mapid=t_object.mapid ";
                            subsql += " and " + tablename + ".layerid=t_object.layerid ";
                            subsql += " and " + tablename + ".objectid=t_object.objectid ";
                            subsql += " inner join (select mapid,layerid,objectid,max(propertydate) as propertydate from " + tablename;
                            subsql += " where " + tablename + ".mapid=" + _MapId;
                            subsql += " and " + tablename + ".layerid=" + layer.ID;
                            if (values != "")
                            {
                                subsql += " and " + tablename + ".objectid in (" + values + ")";
                                subsql += " group by mapid,layerid,objectid) t";
                                subsql += " on " + tablename + ".mapid=t.mapid";
                                subsql += " and " + tablename + ".layerid=t.layerid";
                                subsql += " and " + tablename + ".objectid=t.objectid";
                                subsql += " and " + tablename + ".propertydate=t.propertydate";
                            }
                            else
                            {
                                subsql = "";
                            }
                        }
                    }
                    if (subsql != "")
                    {
                        if (sql != "")
                        {
                            sql += "union all\r\n";
                        }
                        sql += subsql + "\r\n";
                    }
                }
                index++;
            }
            return(sql);
        }