我有跟踪的阵列路线.跟踪的路由是CLLocations数组.所以我有一个数组数组.
我可以采取一条路线并在地图视图上绘制它.但是,我需要将所有路径绘制到地图视图中.
以下是我如何为1条路线创建MKpolyline:
-(voID) loadRoute{ //So we grab an array that holds all the locations of one route. NSArray *locations = [[NSArray alloc] initWithArray:[routesArray objectAtIndex:0]]; // while we create the route points,we will also be calculating the bounding Box of our route // so we can easily zoom in on it. MKMapPoint northEastPoint; MKMapPoint southWestPoint; // create a c array of points. MKMapPoint* pointArr = malloc(sizeof(CLLocationCoordinate2D) *[locations count]); for(int IDx = 0; IDx < [locations count]; IDx++) { CLLocation *tempLoc = (CLLocation*)[locations objectAtIndex:IDx]; CLLocationdegrees latitude = tempLoc.coordinate.latitude; CLLocationdegrees longitude = tempLoc.coordinate.longitude; // create our coordinate and add it to the correct spot in the array CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(latitude,longitude); MKMapPoint point = MKMapPointForCoordinate(coordinate); // if it is the first point,just use them,since we have nothing to compare to yet. if (IDx == 0) { northEastPoint = point; southWestPoint = point; } else { if (point.x > northEastPoint.x) northEastPoint.x = point.x; if(point.y > northEastPoint.y) northEastPoint.y = point.y; if (point.x < southWestPoint.x) southWestPoint.x = point.x; if (point.y < southWestPoint.y) southWestPoint.y = point.y; } pointArr[IDx] = point; } self.routeline = [MKpolyline polylineWithPoints:pointArr count:[locations count]];//Zoom in to fit route on screen _routeRect = MKMapRectMake(southWestPoint.x,southWestPoint.y,northEastPoint.x - southWestPoint.x,northEastPoint.y - southWestPoint.y); // clear the memory allocated earlIEr for the points free(pointArr);}
这是返回叠加层的MapKit委托调用:
#pragma mark MKMapVIEwDelegate- (MKOverlayVIEw *)mapVIEw:(MKMapVIEw *)mapVIEw vIEwForOverlay:(ID <MKOverlay>)overlay{ MKOverlayVIEw* overlayVIEw = nil; if(overlay == self.routeline) { //if we have not yet created an overlay vIEw for this overlay,create it Now. if(nil == self.routelineVIEw) { self.routelineVIEw = [[MKpolylineVIEw alloc] initWithpolyline:self.routeline]; self.routelineVIEw.fillcolor = [UIcolor redcolor]; self.routelineVIEw.strokecolor = [UIcolor redcolor]; self.routelineVIEw.linewidth = 3; } overlayVIEw = self.routelineVIEw; } return overlayVIEw;}
所以上面给出的所有代码都可以.我无法弄清楚如何加载更多叠加来显示其他路线.
我认为可能在loadRoute方法中,运行所有路由并为每个路由创建MKOverlayVIEw.将所有MKOverlayVIEw存储在一个数组中然后执行:
[self.mapVIEw addOverlays:array];
但它不起作用.问题是在委托方法中我不知何故需要知道返回哪个叠加层.
所以,如果我可以做的事情:
- (MKOverlayVIEw *)mapVIEw:(MKMapVIEw *)mapVIEw vIEwForOverlay:(ID <MKOverlay>)overlay{ int tag = overlay.tag; return (MKOverlayVIEw*)[arrayOfVIEws objectAtIndex:tag];}
它会工作正常.但不幸的是它不像那样:(
任何帮助将非常感谢!
编辑:
我在VIEwDIDLoad中使用它来添加叠加层:
[self loadRoute]; // add the overlay to the map if (nil != self.routeline) { [self.mapVIEw addOverlay:self.routeline]; } // zoom in on the route. [self zoomInOnRoute];
这是在标题中:
// the data representing the route points. MKpolyline* _routeline; // the vIEw we create for the line on the map MKpolylineVIEw* _routelineVIEw; // the rect that bounds the loaded points MKMapRect _routeRect;解决方法 routeline和routelineVIEw变量一次只能指向一个叠加层和叠加层视图,因此理论上你需要一个这样的变量数组.
但是,根据显示的代码,您不需要首先保留对这些的引用.
我建议删除routeline和routelineVIEw变量.
然后,您只需在本地创建一个覆盖对象,并在vIEwForOverlay中返回所请求的覆盖参数的视图.
在loadRoute方法中,您可以循环遍历routesArray,并为每个路由创建一个本地覆盖对象,并在其上调用addOverlay.
还有一种更简单的方法来构造一个界定所有路径的地图矩形,以便您可以设置地图的区域以显示所有路线.
例:
-(voID) loadRoute{ _routeRect = MKMapRectNull; for (int raIndex = 0; raIndex < routesArray.count; raIndex++) { //So we grab an array that holds all the locations of one route. NSArray *locations = [[NSArray alloc] initWithArray: [routesArray objectAtIndex:raIndex]]; //note we are getting object at raIndex (not 0) above //...no change to existing code here... //self.routeline = [MKpolyline polylineWithPoints:pointArr count:[locations count]]; //replace above line with this... MKpolyline *pl = [MKpolyline polylineWithPoints:pointArr count:[locations count]]; [mapVIEw addOverlay:pl]; //Zoom in to fit route on screen //_routeRect = MKMapRectMake(southWestPoint.x,northEastPoint.y - southWestPoint.y); //replace above line with this to create a rect around ALL routes... if (MKMapRectIsNull(_routeRect)) _routeRect = pl.boundingMapRect; else _routeRect = MKMapRectUnion(_routeRect,pl.boundingMapRect); // clear the memory allocated earlIEr for the points free(pointArr); } }
在vIEwDIDLoad中,只需调用loadRoute,不要调用addOverlay.
vIEwForOverlay方法变得更加简单:
- (MKOverlayVIEw *)mapVIEw:(MKMapVIEw *)mapVIEw vIEwForOverlay:(ID <MKOverlay>)overlay{ MKpolylineVIEw *pv = [[MKpolylineVIEw alloc] initWithpolyline:overlay]; pv.fillcolor = [UIcolor redcolor]; pv.strokecolor = [UIcolor redcolor]; pv.linewidth = 3; return pv;}
顺便说一句,在loadRoute中,这一行:
MKMapPoint* pointArr = malloc(sizeof(CLLocationCoordinate2D) *[locations count]);
应该:
MKMapPoint* pointArr = malloc(sizeof(MKMapPoint) *[locations count]);
它应该使用MKMapPoint的大小(而不是CLLocationCoordinate2D).它们不是一回事(即使结构碰巧是相同的字节大小).
总结以上是内存溢出为你收集整理的objective-c – 向MKMapView添加多个叠加层全部内容,希望文章能够帮你解决objective-c – 向MKMapView添加多个叠加层所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)