C# Xamarin-iOS地图上的多个多边形

C# Xamarin-iOS地图上的多个多边形,c#,ios,xamarin,xamarin.ios,xamarin.forms,C#,Ios,Xamarin,Xamarin.ios,Xamarin.forms,我目前正在学习向地图添加多边形的教程。我需要能够将多个多边形添加到我的地图中,所以我稍微修改了代码,这样我就可以使用addOverlays,它接收一个IMKOverlay对象数组,而不是一个addOverlay,它只接收一个IMKOverlay对象 但是这不起作用。。。它只在地图上绘制第一个多边形 void addPolygonsToMap() { overlayList = new List<IMKOverlay>();

我目前正在学习向地图添加多边形的教程。我需要能够将多个多边形添加到我的地图中,所以我稍微修改了代码,这样我就可以使用addOverlays,它接收一个IMKOverlay对象数组,而不是一个addOverlay,它只接收一个IMKOverlay对象

但是这不起作用。。。它只在地图上绘制第一个多边形

void addPolygonsToMap()
        {
            overlayList = new List<IMKOverlay>();
            for (int i = 0; i < polygons.Count; i++)
            {

                    CLLocationCoordinate2D[] coords = new CLLocationCoordinate2D[polygons[i].Count];

                    int index=0;
                    foreach (var position in polygons[i])
                    {
                        coords[index] = new CLLocationCoordinate2D(position.Latitude, position.Longitude);
                        index++;
                    }
                    var blockOverlay = MKPolygon.FromCoordinates(coords);
                    overlayList.Add(blockOverlay);

            }
            IMKOverlay[] imko = overlayList.ToArray();
            nativeMap.AddOverlays(imko);

        }

每次调用OverlyRenderer时创建一个新的渲染器实例,无需将渲染器缓存在类级变量中,因为MKMapView将根据需要缓存渲染器

子类MKMapViewDelegate: 实例并将代理指定给地图: 注意:将MyMapDelegate的实例存储在类级别变量中,因为您不想获取GC'd

更新: MKMapView在其地图上显示覆盖涉及两个步骤

1. Calling `AddOverlay` and `AddOverlays`
首先,向地图添加符合IMKOverlay的覆盖。有一些基本的内置类型,如MKCircle、MKPolygon等。。。但你也可以设计自己的覆盖物;i、 e.确定恶劣天气闪电、风暴云、龙卷风等位置的覆盖层。。。这些覆盖图描述项目的地理位置,但不描述如何绘制项目

2. Responding to `OverlayRenderer` requests
当地图的显示区域与其中一个覆盖相交时,地图需要在屏幕上绘制它。将调用地图的委托MKMapViewDelegate子类来提供一个MKOverlayRenderer,该MKOverlayRenderer定义在地图上绘制覆盖的绘图例程

此图形涉及将叠加的地理坐标转换为本地显示坐标,辅助方法可使用核心图形例程使用,但UIKit的使用有一些限制。mkCirclerRenderer、MKPolygonRenderer等都有基本的内置渲染器。。可以使用它,也可以编写自己的mkoverlayrender子类

您可以提供一种自定义方式来渲染MKCircle覆盖,可以是目标样式的红色/白色多环斗牛士,而不是默认的圆形渲染器绘制它的方式,也可以提供在MKPolygon边界内绘制严重风暴符号以匹配自定义严重风暴覆盖的自定义渲染器

我的示例代码:


由于使用MKPolygon构建覆盖,因此可以使用MKPolygon渲染器显示覆盖。在我的示例中,我提供了一个模式匹配开关C 6,它为添加到地图中的每个MKPolygon返回一个半透明的红色/蓝色MKPolygon渲染器。如果添加了非MKPolygon的覆盖,它将引发异常。

我也遇到了这个问题,我找到了创建MKPolygon子类的方法

我已经用我的例子验证了它,它就像一个符咒。但我不确定苹果是否会拒绝我的应用

public class CvPolyon : MKPolygon
    {
        public CustomObject BoundaryOption { get; }

        public CvPolyon1(MKPolygon polygon, CustomObject  boundaryOption)
            :base(polygon.Handle)
        {
            BoundaryOption = boundaryOption;
        }
    }
我们可以像这样在地图上添加多边形

var polygon = MKPolygon.FromCoordinates(coordinates);
                    var overlay = new CvPolyon(polygon, new CustomObject());
                    mapView.AddOverlay(overlay);
public override MKOverlayRenderer OverlayRenderer(MKMapView mapView, IMKOverlay overlay)
        {
            if (overlay is CvPolyon polygon)
            {
                var polygonRenderer = new MKPolygonRenderer(polygon)
                {
                    FillColor   = polygon.BoundaryOption.AreaColor,
                    StrokeColor = polygon.BoundaryOption.LineColor,
                    Alpha       = polygon.BoundaryOption.Alpha,
                    LineWidth   = polygon.BoundaryOption.LineWidth
                };

                if (polygon.BoundaryOption.IsDashedLine)
                    polygonRenderer.LineDashPattern = new[] { new NSNumber(2), new NSNumber(5) };

                return polygonRenderer;
            }

            return mapView.RendererForOverlay(overlay);
        }
我们可以在类中识别多边形,该类像这样扩展了MKMapViewDelegate

var polygon = MKPolygon.FromCoordinates(coordinates);
                    var overlay = new CvPolyon(polygon, new CustomObject());
                    mapView.AddOverlay(overlay);
public override MKOverlayRenderer OverlayRenderer(MKMapView mapView, IMKOverlay overlay)
        {
            if (overlay is CvPolyon polygon)
            {
                var polygonRenderer = new MKPolygonRenderer(polygon)
                {
                    FillColor   = polygon.BoundaryOption.AreaColor,
                    StrokeColor = polygon.BoundaryOption.LineColor,
                    Alpha       = polygon.BoundaryOption.Alpha,
                    LineWidth   = polygon.BoundaryOption.LineWidth
                };

                if (polygon.BoundaryOption.IsDashedLine)
                    polygonRenderer.LineDashPattern = new[] { new NSNumber(2), new NSNumber(5) };

                return polygonRenderer;
            }

            return mapView.RendererForOverlay(overlay);
        }

谢谢你的回答,我只是不知道我应该怎么称呼我的每个多边形。当前,它们存储为一个列表。如果您不称之为映射,则它作为一个方法存在于分配给MKMapView.MapDelegate的MKMapViewDelegate子类中。。。您有MKMapViewDelegate子类吗?没有,我没有MKMapViewDelegate子类:s@BarneyChambers我更新了我的答案,看看能不能帮上忙汉克斯,我现在来看看
public override MKOverlayRenderer OverlayRenderer(MKMapView mapView, IMKOverlay overlay)
        {
            if (overlay is CvPolyon polygon)
            {
                var polygonRenderer = new MKPolygonRenderer(polygon)
                {
                    FillColor   = polygon.BoundaryOption.AreaColor,
                    StrokeColor = polygon.BoundaryOption.LineColor,
                    Alpha       = polygon.BoundaryOption.Alpha,
                    LineWidth   = polygon.BoundaryOption.LineWidth
                };

                if (polygon.BoundaryOption.IsDashedLine)
                    polygonRenderer.LineDashPattern = new[] { new NSNumber(2), new NSNumber(5) };

                return polygonRenderer;
            }

            return mapView.RendererForOverlay(overlay);
        }