我的应用程序中有一个方形MKMapView,我希望设置一个中心点和视图的确切高度/宽度(以米为单位).
创建MKCoordinateRegion并将地图设置为它(如此代码中所示...
MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(center_coord, 1000.0, 1000.0);
[self.mapView setRegion:region animated:YES];
Run Code Online (Sandbox Code Playgroud)
..)无法正常工作,因为在这里使用区域只意味着至少显示该区域,通常比区域更多.
我打算使用setVisibleMapRect:animated:方法,因为我相信这会缩放到实际传递的MKMapRect.
那么,有一种简单的方法可以在MKcoordinateRegion和MKMapRect之间进行转换吗?也许获得该区域的左上角和右下角坐标,并使用它们来制作MKMapRect?
我在Map Kit函数参考中看不到任何方便的东西.
(使用iOS 5,Xcode 4.2)
我有2个注释要显示在mapview上,但无法设置maprect以在屏幕上显示所有这些注释而无需用户缩小.
我试过showAnnotations但没有运气.任何人都可以在Swift和Xcode 6.1.1中做到这一点?
这是我的代码:
class ViewController: UIViewController, MKMapViewDelegate {
@IBOutlet var map: MKMapView!
override func viewDidLoad() {
super.viewDidLoad()
var mapView = map
// 1
let point1 = CLLocationCoordinate2D(latitude: 38.915565, longitude: -77.093524)
let point2 = CLLocationCoordinate2D(latitude: 38.890693, longitude: -76.933318)
//2
let annotation = MKPointAnnotation()
annotation.setCoordinate(point1)
annotation.title = "point1"
map.addAnnotation(annotation)
let annotation2 = MKPointAnnotation()
annotation2.setCoordinate(point2)
annotation2.title = "point2"
map.addAnnotation(annotation2)
//3
// option1: set maprect to cover all annotations, doesn't work
var points = [annotation, annotation2]
var rect = MKMapRectNull
for …Run Code Online (Sandbox Code Playgroud) 如何在地图上垂直移动(通过Pan Gesture)另一个视图,使得引脚保持在覆盖图上方(而不是实际的MapKit覆盖图),如何将引脚置于地图中心.
请参阅附加屏幕截图,了解第一个和最终状态.
当用户平移上/下时,我已经获得了叠加层和屏幕顶部之间空间的CGRect.然而,当用户向上平移时,我如何使用它来移动地图和图钉同时放大地图......当用户向下平移时再次缩小,到目前为止我已经躲过了.
我尝试过不同的方法,从尝试调整可见矩形到调整地图视图的框架.答案可能在于一些MKMapRect/Region技巧.


(Freepik CC BY 3.0 手形图标)
我需要弄清楚如何设置MKMapSnapshotterOptions来拍摄与地球多边形区域相关的空中/卫星图像的快照.
填写'region','scale','size'和'mapType'属性是微不足道的,因为我有一个MKPolygon可以使用.棘手的部分是设置'相机' - 在我的特定情况下,我使用MKMapSnapshotter独立于MKMapView(实际上,甚至不在主线程上).
但是,我更倾向于定位快照,使其符合基于非零标题的多边形边界 - 也就是说,我正在拍摄的区域具有'开始'和'结束',我想从结果图像的底部到顶部定向.由于多边形基本上永远不会在0度标题上自然定向,因此我需要确定'centerCoordinate','heading'和'altitude'.
由于我有多边形的坐标,我能够相当容易地导出中心坐标和所需的标题 - 多边形的第一个坐标与形状的"开始"和结束(或者我的情况下的其他坐标)相关联到最后'.
确定海拔高度证明更加困难; 我想确保多边形区域最终填满我想要显示的快照图像的宽高比.如何在不依赖MKMapView的'setRegion'选择器的情况下计算与MKMapCamera一起使用的正确高度?
mapkit ios mkmaprect cllocationcoordinate2d mkmapsnapshotter
我试图找出MKMapRect的大小(即iPhone的320x568分).
是否有类似于将坐标转换为点的东西?即
[self.mapView convertCoordinate:coordinate1 toPointToView:self.view];
Run Code Online (Sandbox Code Playgroud) 我在地图上有很多长折线.我想优化他们的绘图,因为在几千点处,折线被绘制得非常慢.
我drawMapRect看起来像这样:
- for each polyline segment
- verify if it's bounding box intersects the currently drawn MKMapRect
- if id does, draw it
Run Code Online (Sandbox Code Playgroud)
如果没有太多分数,哪个很好.但是当有8-16个可见的地图和2-3000个点时,它们的速度非常慢for.
如果它们只是位置,那么解决方案就是实现某种四叉树/ r树结构,只过滤当前绘制的那些位置MKMapRect,但我不确定这是否适合折线本身.
如果我仅过滤当前maprect内的段端点,则可能不会绘制某些线段.例如,1-2点之间的两个红色maprects中没有段端点,但仍然需要绘制...
是否有某种算法类似于四叉树或某种方法来解决这个问题?
我需要注释地图上的可见点(无需用户输入)。我正在使用 MKMapViewvisibleMapRect来计算我想要的点。然而,从下面的代码中,我正在读取类似的值
let rect = mapView.visibleMapRect
print(rect.origin.x) //211653840.83766
print(rect.origin.y) //133214809.161136
Run Code Online (Sandbox Code Playgroud)
这不是经度和纬度。但是我发现的任何 MKMapRect 和坐标之间转换的例子都好像原点已经以经度和纬度给出了。我需要做什么才能从中获取经度和纬度visibleMapRect?或者有没有一个公式可以转换我得到的经度和纬度值?
有关其他信息,可见点的经度和纬度为:
103.861463 //longitude
1.3165999 //latitude
Run Code Online (Sandbox Code Playgroud)
当visibleMapRect为:
211653840.83766 //origin.x
133214809.161136 //origin.y
16865.6084111989 //size.width
26357.4158187151 //size.height
Run Code Online (Sandbox Code Playgroud) 我用MKMapRectMake标记东北和西南来显示一个区域。我是这样做的:
routeRect = MKMapRectMake(southWestPoint.x, southWestPoint.y, northEastPoint.x - southWestPoint.x, northEastPoint.y - southWestPoint.y);
[self.mapView setVisibleMapRect:routeRect];
Run Code Online (Sandbox Code Playgroud)
我设置了这个显示区域后,如何才能把地图缩小一点呢?做这个的最好方式是什么?
这是我用来获取rect函数的代码setVisibleMapRect:
for(Path* p in ar)
{
self.routeLine = nil;
self.routeLineView = nil;
// 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) * ar.count);
for(int idx = …Run Code Online (Sandbox Code Playgroud) 我必须在MKMapView上显示MKMapRoute,它必须显示在我的地图上的特定区域,而不是在中心,而是在顶部区域.它必须放在约80个高度的"框架"中.
我想我可以通过使用MKMapView的方法来实现这一点
- (MKMapRect)mapRectThatFits:(MKMapRect)mapRect edgePadding:(UIEdgeInsets)insets
但我面临着一些奇怪的现象.确切地说,如果我使用这段代码:
//obj is the returned mkroute object.
MKRoute *rout = obj;
MKPolyline *line = [rout polyline];
MKMapRect boundingMapRect = [line boundingMapRect];
MKMapRect fittedRect = [self.mapView mapRectThatFits:[line boundingMapRect]
edgePadding:UIEdgeInsetsMake( 100, 0, 0, 0)];
MKCoordinateRegion r = MKCoordinateRegionForMapRect(fittedRect);
[self.mapView setRegion: r animated:YES];
Run Code Online (Sandbox Code Playgroud)
结果在以下屏幕截图中可见:

但是,如果我(0,0,0,0)通过更改前一个代码段的第四行来设置边缘插入:
MKMapRect fittedRect = [self.mapView mapRectThatFits:[line boundingMapRect]
edgePadding:UIEdgeInsetsMake( 100, 0, 0, 0)];
Run Code Online (Sandbox Code Playgroud)
结果是这一个:

您可以清楚地看到,偏移量已从顶部改变了50(而不是100)点.当我使用MKMapRegion的跨度纬度和经度增量时,或者更改设备屏幕时,事情似乎变得更加奇怪.
现在,我的目的只是告诉mapView在一个框架中绘制该路线,说"从顶部64点,高度为80点,宽度为320点",我找不到一个简单的方法来做到这一点而且我害怕我错过了一些东西.我不想通过改变区域的纬度进行游戏,因为内容大小可能会有所不同(可能会显示更小或更大的路线).我错过了什么,这可能是一个简单的方法吗?为什么插图没有正确计算?
mkmaprect ×9
ios ×6
mkmapview ×5
mapkit ×4
objective-c ×3
swift ×3
cocoa-touch ×1
mkannotation ×1