标签: mapkit

如何使用MapKit关注用户位置

我正在使用MapKit显示用户相对于它们周围的引脚的位置.我希望能够通过屏幕左下角的十字准线按钮模仿地图提供的功能.我已经知道MapKit通过MKUserLocation提供了一个CLLocation对象和用户的位置,我只是想就如何关注​​该位置寻求建议.我最初的倾向是使用NSTimer将地图集中在每500ms左右的坐标上.

有一个更好的方法吗?是否有一些内置于MapKit中的东西,我将失踪,这将实现这一目标?

非常感谢,布兰登

iphone cocoa-touch mapkit

10
推荐指数
3
解决办法
2万
查看次数

计算在叠加切片集之外"过度缩放"时要在MapRect中显示的切片

我正在开发一个应用程序,它使用MKOverlay视图在Google基本地图上叠加我自己的自定义地图.我一直在使用Apple优秀的TileMap示例代码(来自WWDC 2010)作为指南.

我的问题 - 当"overzoomed"到比我生成的tile集更深的细节级别时,代码不会显示任何内容,因为在计算的Z级别上没有可用的tile.

我想要的行为 - 当"过度使用"应用程序应该只是继续放大最深层次的瓷砖.叠加层变得模糊是一种很好的用户体验 - 叠加层消失是一种非常糟糕的体验.

这是返回要绘制的图块的代码 - 我需要弄清楚如何修改它以限制Z深度,而不会破坏为叠加图块计算的帧的缩放.有什么想法吗???


- (NSArray *)tilesInMapRect:(MKMapRect)rect zoomScale:(MKZoomScale)scale
{
    NSInteger z = zoomScaleToZoomLevel(scale);

    // PROBLEM: I need to find a way to cap z at my maximum tile directory depth.

    // Number of tiles wide or high (but not wide * high)
    NSInteger tilesAtZ = pow(2, z);

    NSInteger minX = floor((MKMapRectGetMinX(rect) * scale) / TILE_SIZE);
    NSInteger maxX = floor((MKMapRectGetMaxX(rect) * scale) / TILE_SIZE);
    NSInteger minY = floor((MKMapRectGetMinY(rect) * scale) / TILE_SIZE); …
Run Code Online (Sandbox Code Playgroud)

overlay tiles mapkit mkmapview ios

10
推荐指数
1
解决办法
6973
查看次数

MKAnnotation的自定义图像

我创建了一个注释,我将其添加到MKMapView中.如何使用自定义图像而不是标准红色针?

@interface AddressAnnotation : NSObject<MKAnnotation> {
    CLLocationCoordinate2D coordinate;
    NSString *title;
    NSString *subtitle;
    MKPinAnnotationColor pinColor;
}
@property (nonatomic,retain) NSString *title;
@property (nonatomic,retain) NSString *subtitle;
@property (nonatomic, assign) MKPinAnnotationColor pinColor;
@end
Run Code Online (Sandbox Code Playgroud)

objective-c mapkit mkannotation mkannotationview

10
推荐指数
2
解决办法
1万
查看次数

调试CoreGraphics/MapKit中的崩溃

当我的应用程序在iPhone上运行时,我发生间歇性崩溃.所有崩溃都是相同的,并以某种方式涉及MKMapView Overlays(MKCircleViews).

从典型的iPhone 4s崩溃报告:

报告标题:

Hardware Model:      iPhone4,1
Process:         EL-GPS-01 [1021]
Path: /var/mobile/Applications/61288E15-74B5-45B9-99A9-E0B58C767816/EL-GPS-01.app/EL-GPS-01
Identifier:      EL-GPS-01
Version:         ??? (???)
Code Type:       ARM (Native)
Parent Process:  launchd [1]

Date/Time:       2011-11-22 15:59:41.065 +0000
OS Version:      iPhone OS 5.0.1 (9A405)
Report Version:  104

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x00000000
Crashed Thread:  6
Run Code Online (Sandbox Code Playgroud)

崩溃的线程:

Thread 6 name: Dispatch queue: com.apple.root.default-priority
Thread 6 Crashed:
0 ??? 0000000000 0 + 0
1 CoreGraphics 0x319a87c2 0x31967000 + 268226
2 CoreGraphics 0x3199a9e6 0x31967000 + 211430
3 …
Run Code Online (Sandbox Code Playgroud)

iphone core-graphics objective-c mapkit ios

10
推荐指数
1
解决办法
1937
查看次数

MKMapView mapTypes

直到最近我才认为只有三个选项可以设置为MKMapView mapType.

[mapView setMapType:MKMapTypeStandard];
[mapView setMapType:MKMapTypeHybrid];
[mapView setMapType:MKMapTypeSatellite];
Run Code Online (Sandbox Code Playgroud)

但正如在这个链接中所提到的,如何在iphone中的地形视图中加载Google地图,还可以通过设置获得"地形类型(未在文档中提及)"

[mapView setMapType:3];
Run Code Online (Sandbox Code Playgroud)

有趣的是地形模式允许的最大放大率与其他native模式不同.而不是上面的3我尝试整数<3但这不起作用(MapView Standard只显示类型).有谁知道是否有更多的选项设置为类型MKMapView

提前致谢.

iphone mapkit mkmapview ios

10
推荐指数
1
解决办法
8559
查看次数

使用CGPattern填充MKPolygon时,多边形叠加相互干扰(使用Quartz 2D)

背景

在iOS6中,我曾经MKPolygon在MKMapView上添加了几个(覆盖)并提供了特定MKOverlayViewmapView:viewForOverlay:回调(参见MKMapViewDelegate类参考).这个特定视图的工作是使用Quartz 2D用自定义图案填充多边形.它做得很好.

现在,这似乎不再像以前那样在iOS7上运行了.

因为mapView:viewForOverlay:在iOS SDK7 MKOverlayView及其子类中已弃用,我尝试切换到mapView:rendererForOverlay:子类并且MKOverlayRenderer没有成功:遇到的问题是相同的.

因此,以下示例代码将使用MKOverlayView,但您可以在下面的代码中轻松地使用渲染器/渲染器替换视图/视图,并获得相同的效果.

遇到问题

我已将问题减少到能够重现它的最小代码示例,结果如下:

在iOS6上(正如预期的那样): 在iOS6上(如预期的那样)

在iOS7上(不是预期的): 在iOS7上(不是预期的)

我希望我的多边形填充,总是使用相同的模式,并且模式的大小在屏幕上保持不变,与地图的缩放级别无关.

唉,在iOS7上,当在地图上添加多个叠加时,屏幕上的图案尺寸会减小,同时缩小多边形的某些部分.只有在以最大缩放级别放大时,图案才会获得正确的尺寸.

问题没有出现:

  • 仅添加一个叠加层时
  • 当覆盖层间隔良好时
  • 对于具有最低索引的叠加层(当添加多个叠加层时mapView:insertOverlay:atIndex:)

即使只添加了一个图案覆盖层以及其他未图案化的覆盖层,问题似乎也会发生.

代码示例

MTViewController.h

#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>

@interface MTViewController : UIViewController<MKMapViewDelegate>

@property (strong, nonatomic) IBOutlet MKMapView *mapView;    

@end
Run Code Online (Sandbox Code Playgroud)

MTViewController.m

#import "MTViewController.h"
#import <MapKit/MapKit.h>
#import "MTPolygonWithPatternOverlayView.h"

@implementation MTViewController

- (void)dealloc {
    self.mapView.delegate = nil;
}

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; …
Run Code Online (Sandbox Code Playgroud)

cgcontext mapkit quartz-2d ios ios7

10
推荐指数
1
解决办法
969
查看次数

MKMapView覆盖矢量图块

有什么方法可以MKMapView在iOS 6及更高版本中制作矢量图块并过度使用它们吗?我知道如何使用叠加图像MKOverlayView,但它们是光栅图像.

mapkit mkmapview ios mkoverlay vector-tiles

10
推荐指数
1
解决办法
713
查看次数

'title'的类型与协议'MKAnnotation'所需的选项不同

我在swift中遵循了Ray Wenderlich MapKit教程:http://www.raywenderlich.com/90971/introduction-mapkit-swift-tutorial ,当我创建Artwork类时,我得到了标题中写的错误.我不知道自己要做什么.这是代码:

class Artwork: NSObject, MKAnnotation {
let title: String
let locationName: String
let discipline: String
let coordinate: CLLocationCoordinate2D

init(title: String, locationName: String, discipline: String, coordinate: CLLocationCoordinate2D) {
    self.title = title
    self.locationName = locationName
    self.discipline = discipline
    self.coordinate = coordinate

    super.init()
}
}
Run Code Online (Sandbox Code Playgroud)

请帮忙!

iphone mapkit ios swift ios9.1

10
推荐指数
1
解决办法
5541
查看次数

iOS 10 MapKit上一层缩放问题

我正在地图应用程序中工作,该应用程序在地图上呈现折线.我在缩放时遇到问题,它会将先前的折线保留在图块上.

我试图强制重绘:

[self.mapView reloadInputViews];
[self.mapView.layer setNeedsDisplay];
[self.mapView setNeedsDisplay];
Run Code Online (Sandbox Code Playgroud)

我也尝试减慢变焦速度,但问题仍然存在:

[MKMapView animateWithDuration:2
                         delay:0
        usingSpringWithDamping:0.6
         initialSpringVelocity:10
                       options:UIViewAnimationOptionCurveEaseOut
                    animations:^{
                        [self.mapView setVisibleMapRect:unionRectThatFits
                                            edgePadding:UIEdgeInsetsMake(20, 10, 20, 10)
                                               animated:YES];
                    }
                    completion: nil];
Run Code Online (Sandbox Code Playgroud)

有谁知道这个?

在此输入图像描述

iphone mapkit ios ios10

10
推荐指数
1
解决办法
887
查看次数

SwiftUI 使用 MapKit 实现地址自动完成

我有一个表格,用户可以在其中输入他们的地址。虽然他们总是可以手动输入,但我还想为他们提供一种具有自动完成功能的简单解决方案,以便他们可以开始输入地址,然后从列表中点击正确的地址并让它自动填充各个字段。

我首先使用 jnpdx 的 Swift5 解决方案 - /sf/answers/4699196351/

但是,有两个问题我似乎无法解决:

  1. 我需要将结果仅限于美国(不仅仅是美国大陆,而是整个美国,包括阿拉斯加、夏威夷和波多黎各)。我知道 MKCooperativeRegion 如何与中心点一起使用,然后缩放扩展,但它似乎不适用于地址搜索的结果。

  2. 结果的返回仅提供标题和副标题,我需要实际提取所有单独的地址信息并填充我的变量(即地址、城市、州、邮政编码和邮政编码分机号)。如果用户有公寓号或套房号,他们会自己填写。我的想法是创建一个在点击按钮时运行的函数,以便根据用户的选择分配变量,但我不知道如何提取所需的各种信息。苹果的文档一如既往地糟糕,我还没有找到任何解释如何做到这一点的教程。

这是针对最新的 SwiftUI 和 XCode (ios15+)。

我创建了一个用于测试的虚拟表单。这是我所拥有的:

import SwiftUI
import Combine
import MapKit

class MapSearch : NSObject, ObservableObject {
    @Published var locationResults : [MKLocalSearchCompletion] = []
    @Published var searchTerm = ""
    
    private var cancellables : Set<AnyCancellable> = []
    
    private var searchCompleter = MKLocalSearchCompleter()
    private var currentPromise : ((Result<[MKLocalSearchCompletion], Error>) -> Void)?
    
    override init() {
        super.init()
        searchCompleter.delegate = self
        searchCompleter.region = MKCoordinateRegion()
        searchCompleter.resultTypes = MKLocalSearchCompleter.ResultType([.address])
        
        $searchTerm
            .debounce(for: .seconds(0.5), scheduler: …
Run Code Online (Sandbox Code Playgroud)

mapkit mkcoordinateregion mklocalsearch swiftui

10
推荐指数
1
解决办法
5042
查看次数