我正在尝试使用一组GPS坐标并使用自定义MKOverlay和MKOverlayRenderer将它们绘制到叠加层上。我无法得到要点。我知道可能没有必要这样做,但这是更复杂的叠加的第一步。
这里的overlayrenderer中的代码。 points数组包含保存我的MKMapPoint结构的NSValue对象。我已经确认那些MKMapPoints在for循环中是正确的。
-(instancetype)initWithOverlay:(Heatmap*)overlay {
self = [super initWithOverlay:overlay];
if (self){
self.points = overlay.testCoordinates;
}
return self;
}
- (void)drawMapRect:(MKMapRect)mapRect
zoomScale:(MKZoomScale)zoomScale
inContext:(CGContextRef)context
{
CGContextSetRGBFillColor(context, 1.0, 0.0, 0.0, 1.0);
for (NSValue *point in self.points){
MKMapPoint mapPoint;
[point getValue:&mapPoint];
CGPoint datpoint = [self pointForMapPoint:mapPoint];
CGRect rect = CGRectMake(datpoint.x/zoomScale, datpoint.y/zoomScale, 1.0/zoomScale, 1.0/zoomScale);
CGContextFillRect(context, rect);
}
在我的MapView委托的视图控制器中:
- (void)viewDidLoad
{
Heatmap *heatmap = [[Heatmap alloc] init];
[self.mapView setVisibleMapRect:heatmap.boundingMapRect];
[self.mapView addOverlay:heatmap];
}
- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay
{
HeatmapOverlayRenderer *renderer = [[HeatmapOverlayRenderer alloc] initWithOverlay:overlay];
return renderer;
}
正确设置boundingMapRect。所以app应该加载,我应该在屏幕边界内看到100个点。知道我可能有什么错吗?这对我来说都是新的。
答案 0 :(得分:0)
在drawMapRect
中,这一行可能是点不显示的原因:
CGRect rect = CGRectMake(datpoint.x/zoomScale, datpoint.y/zoomScale,
1.0/zoomScale, 1.0/zoomScale);
您可能不希望根据zoomScale更改点的rect的位置 基于缩放的rect的明显位置将由地图视图自动完成。
当前代码正在根据缩放更改地图上的绝对位置和大小 结果位置很可能不在地图上。
相反,绘制点的矩形而不进行任何缩放。
但是,要计算在CGPoints中使用的正确宽度(从米),您需要进行一些计算:
for (NSValue *point in self.points)
{
MKMapPoint mapPoint;
[point getValue:&mapPoint];
CGPoint datpoint = [self pointForMapPoint:mapPoint];
CLLocationDistance rectWidthMeters = 100000.0;
//above sets rect width to 100 km, adjust as needed
CLLocationCoordinate2D mpc = MKCoordinateForMapPoint(mapPoint);
double rectWidthMapPoints = MKMapPointsPerMeterAtLatitude(mpc.latitude);
MKMapPoint mpRight =
MKMapPointMake (mapPoint.x + (rectWidthMapPoints * rectWidthMeters),
mapPoint.y);
CGPoint datpointRight = [self pointForMapPoint:mpRight];
CGFloat rectWidth = datpointRight.x - datpoint.x;
CGRect rect = CGRectMake(datpoint.x, datpoint.y, rectWidth, rectWidth);
CGContextFillRect(context, rect);
}
确保在适当的位置放大,以便看到正方形。
您可能有兴趣查看Apple's sample app HazardMap,其中展示了基于位置网格显示颜色编码的地震危险等级的相似内容。