Как добавить текст в центр многоугольника в Gmap.net - PullRequest
0 голосов
/ 06 июля 2018

Я хочу добавить текст в центральную позицию уже многоугольника зоны. Я могу показать многоугольник, а также получить центральную позицию многоугольника, но не могу добавить имя многоугольника.

Я сделал следующее:

        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 голосов
/ 28 ноября 2018

Я нашел решение для этого после некоторых усилий. Я вызываю метод SetCenterFromVertices () внутри метода UpdateGraphicsPath () класса GMapPolygon.cs и использую метод 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;
    }
0 голосов
/ 13 июля 2018

Я сделал наложение только с некоторой графикой (но не с текстом printet), но вы можете проверить, выполнили ли вы все следующие шаги:

1 .: Вы инициализировали свой GMapControl с mapControl.MarkersEnabled = true;?

2 .: Вы добавили оверлей к элементу управления? mapControl.Overlays.Add(overlay);

3 .: Вы добавили маркеры в свой оверлей? overlay.Markers.Add(marker); Я добавляю их после добавления наложения к элементу управления. может быть, это имеет значение?

4 .: Переопределили ли вы метод OnRender (Graphics g) в вашем GmapMarkerWithLabel? Пример (не проверено):

private string zoneName = "Name from Constructor";
public override void OnRender(Graphics g)
{
    base.OnRender(g);

    // Measure the size of the text. 
    // You might want to add some extra space around your text. 
    // MeasureString is quite tricky...
    SizeF textSize = g.MeasureString(this.zoneName, SystemFonts.DefaultFont);

    // Get LocalPoint (your LatLng coordinate in pixel)
    Point localPosition = this.LocalPosition;

    // Move the localPosition by the half size of the text.
    PointF textPosition = new PointF((float)(localPosition.X - textSize.Width / 2f),(float)(localPosition.Y - textSize.Height / 2f));

    // Draw Background
    g.FillRectangle(SystemBrushes.Control, new RectangleF(textPosition, textSize));
    g.DrawString(this.zoneName, SystemFonts.DefaultFont, Color.Black, textPosition);
}

Надеюсь, это поможет вам начать ...

...