菜鸟教程小白 发表于 2022-12-13 15:38:58

c# - Xamarin - iOS map 上的多个多边形


                                            <p><p>我目前关注 <a href="https://developer.xamarin.com/guides/xamarin-forms/application-fundamentals/custom-renderer/map/polygon-map-overlay/" rel="noreferrer noopener nofollow">this</a>将多边形添加到 map 的教程。我需要能够向我的 map 添加多个多边形,所以我稍微更改了代码,以便我可以使用 <code>addOverlays</code> 来接收 <code>IMKOverlay</code> 对象数组,而不是一个 <code>addOverlay</code> 只接受一个 <code>IMKOverlay</code> 对象。 </p>

<p>但这不起作用...它只在 map 上绘制第一个多边形!</p>

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

                  CLLocationCoordinate2D[] coords = new CLLocationCoordinate2D.Count];

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

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

      }
</code></pre>

<p>在 <a href="https://forums.xamarin.com/discussion/12585/adding-multiple-overlays-to-a-map-view" rel="noreferrer noopener nofollow">this</a>讨论中,似乎每次我需要向 map 中添加另一个多边形时,我都必须调用 <code>MKPolygonRenderer</code> 的新实例,但我不确定这个示例如何转换为我的代码。这是我的 <code>MKPolygonRenderer</code> 函数:</p>

<pre><code>MKOverlayRenderer GetOverlayRenderer(MKMapView mapView, IMKOverlay overlayWrapper)
{
      if (polygonRenderer == null &amp;&amp; !Equals(overlayWrapper, null)) {
          var overlay = Runtime.GetNSObject(overlayWrapper.Handle) as IMKOverlay;
          polygonRenderer = new MKPolygonRenderer(overlay as MKPolygon) {
            FillColor = UIColor.Red,
            StrokeColor = UIColor.Blue,
            Alpha = 0.4f,
            LineWidth = 9
          };
      }
      return polygonRenderer;
}
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>每次调用 <code>OverlayRenderer</code> 时创建一个新的渲染器实例,不需要将渲染器缓存在类级别变量中,因为 <code>MKMapView</code> 会根据需要缓存渲染器.</p>

<h3>子类<code>MKMapViewDelegate</code>:</h3>

<pre><code>class MyMapDelegate : MKMapViewDelegate
{
    public override MKOverlayRenderer OverlayRenderer(MKMapView mapView, IMKOverlay overlay)
    {
      switch (overlay)
      {
            case MKPolygon polygon:
                var prenderer = new MKPolygonRenderer(polygon)
                {
                  FillColor = UIColor.Red,
                  StrokeColor = UIColor.Blue,
                  Alpha = 0.4f,
                  LineWidth = 9
                };
                return prenderer;
            default:
                throw new Exception($&#34;Not supported: {overlay.GetType()}&#34;);
      }
    }
}
</code></pre>

<h3>实例化并将委托(delegate)分配给您的 map :</h3>

<pre><code>mapDelegate = new MyMapDelegate();
map.Delegate = mapDelegate;
</code></pre>

<p>注意:将 <code>MyMapDelegate</code> 的实例存储在类级别变量中,因为您不想被 GC 处理</p>

<h3>更新:</h3>

<p><code>MKMapView</code> 涉及在其 map 上显示叠加层的两个步骤。 </p>

<pre><code>1. Calling `AddOverlay` and `AddOverlays`
</code></pre>

<p>首先,您向 map 添加符合 <code>IMKOverlay</code> 的叠加层。有基本的内置类型,例如 <code>MKCircle</code>、<code>MKPolygon</code> 等……但您也可以设计自己的叠加层;即定义恶劣天气(闪电、暴风云、 Tornado 等)位置的叠加层。这些 MKOverlays 描述了项目的地理位置<strong>但不</strong>如何绘制它。</p>

<pre><code>2. Responding to `OverlayRenderer` requests
</code></pre>

<p>本地图的显示区域与其中一个叠加层相交时, map 需要将其绘制在屏幕上。调用 map 的委托(delegate)(您的 <code>MKMapViewDelegate</code> 子类)来提供一个 <code>MKOverlayRenderer</code>,它定义了绘制例程以在 map 上绘制叠加层。 </p>

<p>此绘图涉及使用 Core Graphics 例程(UIKit 可以使用但有一些限制)将叠加层的地理坐标转换为本地显示坐标(可以使用辅助方法)。 MKCircleRenderer、MKPolygonRenderer 等有基本的内置渲染器,可以使用,也可以编写自己的 <code>MKOverlayRenderer</code> 子类。 </p>

<p>您可以提供一种自定义方式来渲染 <code>MKCircle</code> 叠加层,可能是目标样式的红/白多环靶心,而不是默认的圆形渲染器绘制它的方式,或者自定义渲染器在 <code>MKPolygon</code> 的范围内绘制强 Storm 符号以匹配您的自定义强 Storm 叠加层。</p>

<p>我的示例代码:</p>

<p>由于您使用 <code>MKPolygon</code> 来构建叠加层,因此您可以使用 <code>MKPolygonRenderer</code> 来显示它们。在我的示例中,我提供了一个模式匹配开关 (C# 6),它为您添加到 map 中的 <em>每个</em> MKPolygon 返回一个半透明的红色/蓝色 MKPolygonRenderer(如果您添加了一个非基于 MKPolygon 的叠加层)它会抛出异常)。</p></p>
                                   
                                                <p style="font-size: 20px;">关于c# - Xamarin - iOSmap 上的多个多边形,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/46148371/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/46148371/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: c# - Xamarin - iOS map 上的多个多边形