c# - Xamarin - iOS Multiple polygons on map -


i following this tutorial adding polygon map. need able add multiple polygons map, have altered code can use addoverlays takes in array of imkoverlay objects instead of 1 addoverlay takes in single imkoverlay object.

this doesn't work however... draws first polygon on map!

void addpolygonstomap()         {             overlaylist = new list<imkoverlay>();             (int = 0; < 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);          } 

in this discussion, appear have call new instance of mkpolygonrenderer each time need add polygon map, i'm unsure how example translates code. here mkpolygonrenderer function:

mkoverlayrenderer getoverlayrenderer(mkmapview mapview, imkoverlay overlaywrapper)   {       if (polygonrenderer == null && !equals(overlaywrapper, null)) {           var overlay = runtime.getnsobject(overlaywrapper.handle) imkoverlay;           polygonrenderer = new mkpolygonrenderer(overlay mkpolygon) {               fillcolor = uicolor.red,               strokecolor = uicolor.blue,               alpha = 0.4f,               linewidth = 9           };       }       return polygonrenderer;   } 

create new renderer instance each time overlayrenderer called, there no need cache renderer in class level variable mkmapview cache renderers needed.

subclass mkmapviewdelegate:

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($"not supported: {overlay.gettype()}");         }     } } 

instance , assign delegate map:

mapdelegate = new mymapdelegate(); map.delegate = mapdelegate; 

note: store instance of mymapdelegate in class level variable not want gc'd

update:

mkmapview has 2 steps involved display overlay on map.

1. calling `addoverlay` , `addoverlays` 

first add overlays map conform imkoverlay. there basic built-in types such mkcircle, mkpolygon, etc... can design own overlays; i.e. overlays define location of severe weather (lightning, storm clouds, tornados, etc..). these mkoverlays describe geo-location of item but not how draw it.

2. responding `overlayrenderer` requests 

when display area of map intersects 1 of overlays, map need draw on screen. map's delegate (your mkmapviewdelegate subclass) called supply mkoverlayrenderer defines drawing routines paint overlay on map.

this drawing involves converting geo-coordinates of overlay local display coordinates (helper methods available) using core graphics routines (uikit can used limitations). there basic built-in renderers mkcirclerenderer, mkpolygonrenderer, etc.. can used or can write own mkoverlayrenderer subclass.

you supply custom way renderer mkcircle overlay, maybe target-style red/white multi-ringed bullseye, instead of way default circle renderer draws it, or custom renderers draw severe storm symbols within bounds of mkpolygon match custom severe storm overlays.

my example code:

since using mkpolygon build overlays, can use mkpolygonrenderer display them. in example, provide pattern matching switch (c# 6) returns semi-transparent red/blue mkpolygonrenderer every mkpolygon added map (if added non-mkpolygon based overlay throw exception).


Comments

Popular posts from this blog

Sort a complex associative array in PHP -

vb.net - How to ignore if a cell is empty nothing -

recursion - Can every recursive algorithm be improved with dynamic programming? -