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
Post a Comment