获取 MKMapView 的边界
为了设置对外部服务器的查询,我想获取我正在构建的 iPhone 应用程序中当前地图视图的边界。 UIView 应该响应边界,但似乎 MKMapView 没有。设置区域并放大地图后,我尝试获取边界。我被困在第一步,即尝试获取代表地图东南角和西北角的 CGPoints。之后我将使用:
- (CLLocationCoordinate2D)convertPoint:(CGPoint)point toCoordinateFromView:(UIView *)view
将点转换为地图坐标。但我什至无法做到这一点...
//Recenter and zoom map in on search location
MKCoordinateRegion region = {{0.0f, 0.0f}, {0.0f, 0.0f}};
region.center = mySearchLocation.searchLocation.coordinate;
region.span.longitudeDelta = 0.01f;
region.span.latitudeDelta = 0.01f;
[self.mapView setRegion:region animated:YES];
//After the new search location has been added to the map, and the map zoomed, we need to update the search bounds
//First we need to calculate the corners of the map
CGPoint se = CGPointMake(self.mapView.bounds.origin.x, mapView.bounds.origin.y);
CGPoint nw = CGPointMake((self.mapView.bounds.origin.x + mapView.bounds.size.width), (mapView.bounds.origin.y + mapView.bounds.size.height));
NSLog(@"points are: se %@, nw %@", se, nw);
代码编译时没有警告,但是 se 和 nw 都是 null。查看 self.mapView.bounds.origin.x ,变量为 0。尝试直接 NSLog self.mapView.bounds.size.width 给我一个“程序收到信号:“EXC_BAD_ACCESS”。这似乎来自 NSLog。
有人知道从 MKMapView 的可见区域获取东南角和西北角(在地图坐标中)的正确方法吗?
编辑:似乎每当您在这里问一些问题时,答案就会立即出现。我使用 %@ 而不是 @f 来打印 NSLog 中的每个变量,这会引发错误。我还发现了MKMapview的annotationVisibleRect属性。看来,annotationVisibleRect 是基于父视图坐标的。
In order to setup a query to an external server I want to get the bounds of the current Map View in an iPhone app I'm building. UIView should respond to bounds but it seems MKMapView doesn't. After setting a region and zooming in the map I try to get the bounds. I'm stuck on the first step which is to try to get the CGPoints that represent the SE and NW corners of the map. After that I was going to use:
- (CLLocationCoordinate2D)convertPoint:(CGPoint)point toCoordinateFromView:(UIView *)view
To transform the points into map coordinates. But I can't even get that far...
//Recenter and zoom map in on search location
MKCoordinateRegion region = {{0.0f, 0.0f}, {0.0f, 0.0f}};
region.center = mySearchLocation.searchLocation.coordinate;
region.span.longitudeDelta = 0.01f;
region.span.latitudeDelta = 0.01f;
[self.mapView setRegion:region animated:YES];
//After the new search location has been added to the map, and the map zoomed, we need to update the search bounds
//First we need to calculate the corners of the map
CGPoint se = CGPointMake(self.mapView.bounds.origin.x, mapView.bounds.origin.y);
CGPoint nw = CGPointMake((self.mapView.bounds.origin.x + mapView.bounds.size.width), (mapView.bounds.origin.y + mapView.bounds.size.height));
NSLog(@"points are: se %@, nw %@", se, nw);
The code compiles without warnings however se and nw are both null. Looking at self.mapView.bounds.origin.x the variable is 0. Trying to NSLog directly self.mapView.bounds.size.width gives me a "Program received signal: “EXC_BAD_ACCESS”." which seems to come from NSLog.
Anyone know the proper way to get the south east corner and northwest corner (in map coordinates) from the visible area of a MKMapView?
EDIT: It seems whenever you asked something here the answer comes to you right after. I was using %@ instead of @f to print each variable in NSLog which was throwing errors there. I also discovered the annotationVisibleRect property of MKMapview. It seems though that the annotationVisibleRect is based on the parent view coordinates.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(10)
好吧,我正式回答了我自己的问题,但由于我在任何地方都找不到它,所以我将在这里发布答案:
SWIFT 5
用法
Okay I officially answered my own question but since I didn't find it anywhere before I'll post the answer here:
SWIFT 5
Usage
另一种选择是使用 MKMapView 实例上的visibleMapRect 属性,并使用MKCooperativeForMapPoint() 转换为纬度/经度。
斯威夫特5
Another option is to use the visibleMapRect property on your MKMapView instance and use MKCoordinateForMapPoint() to convert to the lat/lon.
Swift 5
迅速离开...(基于@deadroxy的回答...)
Swift away... (Based on @deadroxy's answer...)
此扩展解决了这个问题并维护了 Swift 5 中的
centerCooperative
语法This extension solves this problem and maintain the
centerCoordinate
syntax in Swift 5这个http://wiki.openstreetmap.org/wiki/Bounding_Box是一个关于边界框的文档
< a href="https://i.sstatic.net/mBh6u.png" rel="noreferrer">
您可以有一个
BoundingBox
结构来表示此visibleMapRect
与region.span
相同This http://wiki.openstreetmap.org/wiki/Bounding_Box is a document for bounding box
You can have a
BoundingBox
struct that represents thisThe
visibleMapRect
is the same asregion.span
为了我的目的更新了@onmyway133的优秀答案,我需要所有四个角的坐标:
以及我如何使用此数据的示例:
Updated @onmyway133's excellent answer for my purposes, I needed the coordinates of all four corners:
And an example of how I used this data:
我能够让它与 Parse GeoBox 查询一起使用:
I was able to get this to work with the Parse GeoBox query:
这个网站解决了这个问题。
http:// /www.softwarepassion.com/how-to-get-geographic-coordinates-of-the-visible-mkmapview-area-in-ios/
this website solve the problem.
http://www.softwarepassion.com/how-to-get-geographic-coordinates-of-the-visible-mkmapview-area-in-ios/
此代码适用于 90/180 度旋转的地图。
设置mapView.pitchEnabled = NO;为了减少错误。
This code works with map rotating like 90/180 degrees.
set mapView.pitchEnabled = NO; for less bugs.
对于已经两根手指旋转的地图的其他一些答案,我遇到了一些麻烦。此代码对我有用:
我的答案源自 陈保状的答案 和相关网站 在此处输入链接说明。西南角和东北角也简化了 3 条线。
I was having some trouble with some of the other answers for maps that had been 2 finger rotated. This code worked for me:
My answer is derived from 陈保状's answer and the associated website enter link description here. Its simplified down too 3 lines for south west and north east corners.