如何在Gmap.net中的多边形中心添加文本

时间:2018-07-06 04:22:01

标签: c# winforms maps gis gmap.net

我想在已经区域多边形的中心位置添加文本。我可以显示多边形,也可以获取多边形的中心位置,但不能添加多边形的名称。

到目前为止,我已经完成了以下操作:

        List<PointLatLng> listVertexPoints = Get_VertexPointsFromString(zoneVertex);
        foreach (PointLatLng vertex in listVertexPoints)
        {
            GMapMarkerCircle circleVertex = new GMapMarkerCircle(vertex, 1);
            circleVertex.Radius = 1;
            circleVertex.IsVisible = false;
            overlay.Markers.Add(circleVertex);
        }

        GMapPolygon zonePolygon;
        zonePolygon = new GMapPolygon(listVertexPoints, zoneName);
        zonePolygon.Fill = new SolidBrush(Color.FromArgb(50, Color.Red));
        zonePolygon.Stroke = new Pen(zoneBoundaryColor, 1);
        zonePolygon.IsFilled = true;
        zonePolygon.IsHitTestVisible = true;
        overlay.Polygons.Add(zonePolygon);

        PointLatLng centerPoint = GetZoneCenter(listVertexPoints);

        private PointLatLng GetZoneCenter(List<PointLatLng> vertexes)
        {
          PointLatLng centerPoint = new PointLatLng();
          int sum = 0;
          double lat = 0;
          double lng = 0;
          foreach (var point in vertexes)
          {
              sum += 1;
              lat += point.Lat;
              lng += point.Lng;
          }
          lat = lat / sum;
          lng = lng / sum;
          centerPoint.Lat = lat;
          centerPoint.Lng = lng;
          return centerPoint;
      }
        var labelMarker = new GmapMarkerWithLabel(centerPoint, zoneName, GMarkerGoogleType.blue);
        markerOverlay.Markers.Add(labelMarker);
        this.MainMap.Overlays.Add(overlay);

上面的代码显示了一个标签标记,但是没有出现在正确的位置。另外,如果您有其他方法可以在Polygon中显示文字,那么我们将非常欢迎。

谢谢!

2 个答案:

答案 0 :(得分:1)

我只覆盖了一些图形(没有打印图像文本),但是您可以检查是否已完成以下所有步骤:

1 .:您是否已使用def test(word) proc do define_method(:hello) do puts word end end end Class.new(&test("hello")).new.hello 初始化GMapControl?

2 .:您是否已将叠加层添加到控件? mapControl.MarkersEnabled = true;

3 .:您是否已将标记添加到叠加层? mapControl.Overlays.Add(overlay);     我将叠加层添加到控件后添加它们。也许有所作为?

4 .:您是否在GmapMarkerWithLabel中覆盖了OnRender(Graphics g)方法?     示例(未选中):

overlay.Markers.Add(marker);

我希望这可以帮助您开始...

答案 1 :(得分:1)

经过一番努力,我找到了解决方案。我在GMapPolygon.cs类的UpdateGraphicsPath()方法内调用SetCenterFromVertices()方法,并使用图形的drawString方法在所需位置绘制文本。这是必需的,因为可能会调整多边形的大小;我们也需要更改文本的位置。

    #region use this line inside OnRender(Graphics g) method
    g.DrawString(this.Name, font_PolygonName, Brushes.AliceBlue, (float)center.X, (float)center.Y);
    #endregion

    private Point_ center = new Point_();

    void SetCenterFromVertices()
    {
        List<Point_> lstPoint = new List<Point_>();
        foreach (var p in LocalPoints)
        {
            Point_ np = new Point_();
            np.X = p.X;
            np.Y = p.Y;
            lstPoint.Add(np);
        }
        center = Compute2DPolygonCentroid(lstPoint);
    }

    static Point_ Compute2DPolygonCentroid(List<Point_> vertices)
    {
        Point_ centroid = new Point_() { X = 0.0, Y = 0.0 };
        double signedArea = 0.0;
        double x0 = 0.0;
        double y0 = 0.0;
        double x1 = 0.0;
        double y1 = 0.0;
        double a = 0.0;

        // For all vertices except last
        int i = 0;
        for (i = 0; i < vertices.Count - 1; ++i)
        {
            x0 = vertices[i].X;
            y0 = vertices[i].Y;
            x1 = vertices[i + 1].X;
            y1 = vertices[i + 1].Y;
            a = x0 * y1 - x1 * y0;
            signedArea += a;
            centroid.X += (x0 + x1) * a;
            centroid.Y += (y0 + y1) * a;
        }

        // Do last vertex
        x0 = vertices[i].X;
        y0 = vertices[i].Y;
        x1 = vertices[0].X;
        y1 = vertices[0].Y;
        a = x0 * y1 - x1 * y0;
        signedArea += a;
        centroid.X += (x0 + x1) * a;
        centroid.Y += (y0 + y1) * a;

        signedArea *= 0.5;
        centroid.X /= (6 * signedArea);
        centroid.Y /= (6 * signedArea);

        return centroid;
    }