我有几百个地点的列表,只想为当前屏幕上的那些位置显示MKPinAnnotation。屏幕以用户当前位置开始,半径为2英里。当然,用户可以在屏幕上滚动和缩放。现在,我等待地图更新事件,然后遍历我的位置列表,并检查这样的坐标:
-(void)mapViewDidFinishLoadingMap:(MKMapView *)mapView {
CGPoint point;
CLLocationCoordinate2D coordinate;
. . .
/* in location loop */
coordinate.latitude = [nextLocation getLatitude];
coordinate.longitude = [nextLocation getLongitude];
/* Determine if point is in view. Is there a better way then this? */
point = [mapView convertCoordinate:coordinate toPointToView:nil];
if( (point.x > 0) && (point.y>0) ) {
/* Add coordinate to array that is later added to mapView */
}
所以我要求convertCoordinate在屏幕上显示该点(除非我误解了这种方法,这是非常可能的)。如果坐标不在屏幕上,那么我从不将它添加到mapView。
所以我的问题是,这是确定位置的纬度/经度是否会出现在当前视图中并且应该添加到mapView的正确方法吗?或者我应该以不同的方式做这件事吗?
答案 0 :(得分:7)
在您的代码中,您应该传递toPointToView:
选项的视图。我把它给了我mapView
。您还必须为x和y指定上限。
这里有一些对我有用的代码(告诉我地图上当前可见的注释,同时循环注释):
for (Shop *shop in self.shops) {
ShopAnnotation *ann = [ShopAnnotation annotationWithShop:shop];
[self.mapView addAnnotation:ann];
CGPoint annPoint = [self.mapView convertCoordinate:ann.coordinate
toPointToView:self.mapView];
if (annPoint.x > 0.0 && annPoint.y > 0.0 &&
annPoint.x < self.mapView.frame.size.width &&
annPoint.y < self.mapView.frame.size.height) {
NSLog(@"%@ Coordinate: %f %f", ann.title, annPoint.x, annPoint.y);
}
}
答案 1 :(得分:3)
我知道这是一个老线程,不知道当时有什么可用......但你应该这样做:
// -- Your previous code and CLLocationCoordinate2D init --
MKMapRect visibleRect = [mapView visibleMapRect];
if(MKMapRectContainsPoint(visibleRect, MKMapPointForCoordinate(coordinate))) {
// Do your stuff
}
无需转换回屏幕空间。 另外我不确定你为什么要这样做的原因,我认为当它们不在屏幕上时不添加注释是很奇怪的... MapKit已经优化了这个并且只创建(和回收)可见的注释视图
答案 2 :(得分:2)
经过一番阅读后,我找不到任何说这是个坏主意的东西。我在我的应用程序中做了一些测试,我总能得到正确的结果。当我只添加将显示在当前可见地图区域中的坐标而不是一次显示所有300+坐标时,应用程序加载速度会快得多。
我所寻找的是像[mapView isCoordinateInVisibleRegion:myCoordinate]这样的方法,但到目前为止,这种方法很快,看起来很准确。
我还将标题更改为“在可见地图区域”而不是之前,因为我认为错误的标题可能会混淆我的意思。