谷歌地图iso瓦片层不工作GMSTileURLConstructor GMSURLTileLayer

时间:2016-07-01 16:24:40

标签: ios google-maps

GMSTileURLConstructor GMSURLTileLayer未显示切片

我正在尝试将自己的图块(tilestream)覆盖在Google地图上方。 但它失败了。因此,我决定在google地图上尝试叠加openstreet地图图块,因为tilestream的图块网址与openstreet地图的网址结构相同。两者都是http://xxx/z/x/y.png

使用GMSTileURLConstructor GMSURLTileLayer,但显示瓷砖失败

只有谷歌S​​DKdemo示例正常工作。 网址是:

 NSString *url = [NSString stringWithFormat:@"https://www.gstatic.com/io2010maps/tiles/9/L1_%tu_%tu_%tu.png",zoom, x, y];

如果我使用openstreet网址,则无法在任何缩放级别显示自定义图块。

 NSString *url = [NSString stringWithFormat:@"http://a.tile.openstreetmap.org/%tu/%tu/%tu.png", (unsigned long)zoom, (unsigned long)x, (unsigned long)y];

zIndex设置为99,100,1,仍未显示切片。

我确认磁贴服务器工作正常,如果我直接在浏览器中使用网址,则会正确接收磁贴图像。

谷歌样本平面图瓷砖,缩放,x,y完全匹配openstreet地图缩放,x,y。

我不明白,为什么谷歌样本磁贴网址工作正常,但openstreet地图网址磁贴DOSE没有显示。

这是我的代码:有人知道为什么吗?

- (void)viewDidLoad {
[super viewDidLoad];


//------------- google map ------------

//    GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:33.6599244
//                                                            longitude:-117.915058135
//                                                                 zoom:13];

   GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:37.78318
                                                            longitude:-122.403874
                                                                 zoom:18];




mapView_ = [GMSMapView mapWithFrame:CGRectZero camera:camera];
//mapView_.myLocationEnabled = YES;
mapView_.mapType = kGMSTypeHybrid;
mapView_.buildingsEnabled = NO;
mapView_.indoorEnabled = NO;

self.view = mapView_;




// Create a new GMSTileLayer with the new floor choice.
GMSTileURLConstructor urls = ^(NSUInteger x, NSUInteger y, NSUInteger zoom) {

    //NSString *url = [NSString stringWithFormat:@"https://www.gstatic.com/io2010maps/tiles/9/L1_%tu_%tu_%tu.png",zoom, x, y];



     //NSString *url = [NSString stringWithFormat:@"http://tile.openstreetmap.org/%tu/%tu/%tu.png", zoom, x, y];
     NSString *url = [NSString stringWithFormat:@"http://a.tile.openstreetmap.org/%tu/%tu/%tu.png", (unsigned long)zoom, (unsigned long)x, (unsigned long)y];

    NSLog(@"%@", url);
    return [NSURL URLWithString:url];
};
layer = [GMSURLTileLayer tileLayerWithURLConstructor:urls];


layer.zIndex = 1;
layer.opacity= 0.5;

layer.map = mapView_;

1 个答案:

答案 0 :(得分:4)

10小时后尝试失败,我终于找到了原因?

这是因为安全设置阻止从远程服务器下载任何瓷砖图像,json,任何东西。

控制台上的错误消息是:

无法加载资源,因为App Transport Security策略要求使用安全连接

解决方案是:

  1. 打开我的Projects info.plist文件(作为来源)
  2. 添加密钥

    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
        <key>NSExceptionDomains</key>
        <dict>
            <key>yourdomain.com</key>
            <dict>
                <key>NSIncludesSubdomains</key>
                <true/>
                <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
                <false/>
            </dict>
       </dict>
    

  3. 现在它可以工作,我成功地在谷歌地图上覆盖openstreet地图,我也可以覆盖谷歌地图上任何瓷砖服务器上的任何自定义图块。

    其中yourdomain.com例如是http://b.tile.opentopomap.org(如果是OSM拓扑图)。您必须为每个http提供程序添加密钥。