我想知道是否有任何方式来配置我们的MapKit地图像我们做的谷歌地图API的MapTypeStyle对象。
如果我指的是苹果文档的,具有的MKMapView接受一个地图类型选项MKMapType不变 ,但像在MapOptions没有风格参数MapTypeStyle和MapTypeStyler至极是快速的地图定制非常强大。
所以我的问题是:有没有什么办法可以实现与MapKit框架类似的东西,如果没有,什么是最好的框架/库来做到这一点? 我在想MapBox和类似产品。
我想知道是否有任何方式来配置我们的MapKit地图像我们做的谷歌地图API的MapTypeStyle对象。
如果我指的是苹果文档的,具有的MKMapView接受一个地图类型选项MKMapType不变 ,但像在MapOptions没有风格参数MapTypeStyle和MapTypeStyler至极是快速的地图定制非常强大。
所以我的问题是:有没有什么办法可以实现与MapKit框架类似的东西,如果没有,什么是最好的框架/库来做到这一点? 我在想MapBox和类似产品。
还有我对你的朋友几个选项。 你可以使用这些框架的一个
http://cloudmade.com/products/iphone-sdk
https://github.com/route-me/route-me
或者你可以只使用mapbox。 他们的API看起来不错。 或者你提供你自己的地图瓦片和覆盖mapkit。 像这样的事情在MKOverlayView
- (void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context {
NSURL* fileURL = [(HeatMap*)self.overlay localUrlForStyle:@"alien" withMapRect:mapRect andZoomScale:zoomScale];
NSData *imageData = [NSData dataWithContentsOfURL:fileURL ];
if (imageData != nil) {
UIImage* img = [UIImage imageNamed:@"aTileX.png"];
// Perform the image render on the current UI context
UIGraphicsPushContext(context);
[img drawInRect:[self rectForMapRect:mapRect] blendMode:kCGBlendModeNormal alpha:1.0];
UIGraphicsPopContext();
}
}
如果你想不支持的“地形”模式,也看看这个http://openradar.appspot.com/9621632
实际上,我在需要在地图上覆盖瓦片程序的中间。 这个例子非常有帮助。 你会想看看MKOverlay和MKOverlayView。 我现在做的项目涉及使用gheat 。 我通过NSURLConnection的访问砖和存储在本地。 一个要点我实现的。
有没有办法用mapkit本地自定义地图样式。 你只有这个选项是选择一种混合的应用程序的方法,然后自定义使用HTML / JavaScript的页面本身的样式。
作为绘制的瓷砖发生在被称为私有类MKMapTileView
你不能简单地写一个类别。 你必须实现另一个类的自定义绘制。 这个类的方法将被用于重载实施MKMapTileView
运行时:
头文件:
@interface MyColorMap : NSObject
+ (void)overLoadMethods:(Class)destinationClass;
@end
的Imlementatio:
#import "MyColorMap.h"
#import <objc/runtime.h>
@implementation MyColorMap
+ (void)overLoadMethods:(Class)destinationClass {
// get the original method for drawing a tile
Method originalDrawLayer = class_getInstanceMethod(destinationClass, @selector(drawLayer:inContext:));
// get the method we will replace with the original implementation of 'drawLayer:inContext:' later
Method backupDrawLayer = class_getInstanceMethod([self class], @selector(backupDrawLayer:inContext:));
// get the method we will use to draw our own colors
Method myDrawLayer = class_getInstanceMethod([self class], @selector(myDrawLayer:inContext:));
// dito with the implementations
IMP impOld = method_getImplementation(originalDrawLayer);
IMP impNew = method_getImplementation(myDrawLayer);
// replace the original 'drawLayer:inContext:' with our own implementation
method_setImplementation(originalDrawLayer, impNew);
// set the original 'drawLayer:inContext:' implementation to our stub-method, so wie can call it later on
SEL selector = method_getName(backupDrawLayer);
const char *types = method_getTypeEncoding(backupDrawLayer);
class_addMethod(destinationClass, selector, impOld, types);
}
- (void)backupDrawLayer:(CALayer*)l inContext:(CGContextRef)c {
// stub method, implementation will never be called. The only reason we implement this is so we can call the original method durring runtime
}
- (void)myDrawLayer:(CALayer*)l inContext:(CGContextRef)c {
// set background to white so wie can use it for blendmode
CGContextSetFillColorWithColor(c, [[UIColor whiteColor] CGColor]);
CGContextFillRect(c, CGContextGetClipBoundingBox(c));
// set blendmode so the map will show as grayscale
CGContextSetBlendMode(c, kCGBlendModeLuminosity);
// kCGBlendModeExclusion for inverted colors etc.
// calling the stub-method which will become the original method durring runtime
[self backupDrawLayer:l inContext:c];
// if you want more advanced manipulations you can alter the context after drawing:
// int w = CGBitmapContextGetWidth(c);
// int h = CGBitmapContextGetHeight(c);
//
// unsigned char* data = CGBitmapContextGetData(c);
// if (data != NULL) {
// int maxY = h;
// for(int y = 0; y<maxY; y++) {
// for(int x = 0; x<w; x++) {
//
// int offset = 4*((w*y)+x);
// char r = data[offset];
// char g = data[offset+1];
// char b = data[offset+2];
// char a = data[offset+3];
//
// // do what ever you want with the pixels
//
// data[offset] = r;
// data[offset+1] = g;
// data[offset+2] = b;
// data[offset+3] = a;
// }
// }
// }
}
现在你必须调用[MyColorMap overLoadMethods:NSClassFromString(@"MKMapTileView")]
在某一时刻使用前MKMapView