2017-09-26 121 views
0

我加载我国的MBTiles矢量瓷砖数据源,使用CARTO移动SDK脱机地理编码使用MBTiles与矢量瓦片

// Initialize base layer with a bundled styles 
    let baseLayer = NTCartoOnlineVectorTileLayer(style: NTCartoBaseMapStyle.CARTO_BASEMAP_STYLE_GRAY) 

    // Use the style for your own vector tile datasource (online, offline etc), 
    let tileDataSource = NTMBTilesTileDataSource(path: Bundle.main.path(forResource: "estonia_ntvt", ofType: "mbtiles")) 

    // Initialize offline layer & Grab vector tile layer from our base layer 
    let offlineLayer = NTVectorTileLayer(tileDataSource, baseLayer?.getTileDecoder()) 

    mapView?.layers?.add(baseLayer) 
    mapView?.layers?.add(offlineLayer) 

,并呈现出一切正常,所以我有我的地图和所有功能。

所以现在我想搜索,对于POI街道名称

我知道一个MBTiles具有他内部的所有信息,但是我怎样才能访问这些信息?

这是posible吗?如果可能的话,我该怎么做?

回答

0

CARTO mobile SDK的最新版本(4.1.0)有NTVectorTileSearchService使用mbtiles。目前还没有用户文档,但示例代码可以从AdvancedMap.Swift中找到。

// init search service with your mbtiles 
searchService = NTVectorTileSearchService(dataSource: baseSource, tileDecoder: baseLayer.getTileDecoder()) 

// prepare search request, set some conditions. 
// This search is to find attractions within 500m from a route geometry 

let request = NTSearchRequest() 
request?.setProjection(contentView.baseSource.getProjection()) 
request?.setGeometry(geometry) 
request?.setSearchRadius(500.0) 
request?.setFilterExpression("class='attraction'") 

// actual search 
let results = contentView.searchService.findFeatures(request) 
let count = Int((results?.getFeatureCount())!) 

// go through found items 
for i in 0..<count { 
     let item = results?.getFeature(Int32(i))! 

     if (item?.getGeometry() is NTPointGeometry) { 
      contentView.addPOI(feature: item!) 
     } 
} 

请注意,此搜索服务更适用于POI或街道几何搜索。另外请注意,同一条街道通常会在不同的瓷砖中复制,而且大多边形往往局部在平铺中。

通过地理编码我们的意思是有点不同的事情 - 寻找人类可读地址或搜索给定位置的地址(反向地理编码)。 MBTiles/Vector瓷砖没有完整的数据,它为视觉效果进行了优化。例如,建筑物或地址点可能有房屋号码标签,但几乎从未拥有街道或城市和国家的数据,因为这将是多余的,并且不需要视觉地图。现在对于文字地理编码CARTO SDK也有解决方案:NTGeocodingService。您可以在线或离线使用,仅适用于离线情况下,SDK必须下载特殊不同的数据包每个国家(或城市,如果你想要的话)。这些数据包具有完整的分层地址数据,因此真正的地理编码可以与他们一起工作。因此,对于完整的离线数据,您需要分别获得两个离线包:用于地图和地理编码数据库的mbtiles。如果您还想要脱机路由,那么还需要第三个数据集,因为这也无法单独从mbtiles /矢量磁贴完成。

这是一项非常新的功能,因此您需要使用SDK的预发布版本,但您的反馈非常受欢迎。

+0

@ JaakL,对于最近的回复抱歉,我正在测试代码,它比我想象的更好。另一件事,我怎样才能建立这些特殊的数据包,而不是你说的?我想将它们捆绑到我的应用程序中,而不是先下载 –

+0

一般性评论。我们不想建议捆绑,因为下载后用户将始终获得最新的数据更新。此外,安装程序会更小,因为您可以在下载数据时为用户提供更多的自由 - 在第一次应用程序启动时或稍后时间使其成为可选项(某些用户存储空间不足 - 即那些讨厌的8GB存储Android!)。捆绑数据的优点是什么? – JaakL

+0

我在古巴居住的地方,互联网接入非常有限,价格昂贵,而且从任何地方都不是,而且在非常缓慢的地方,有时20或40 mb的下载通常需要大约30分钟,如果连接没有漏掉。当我工作时(在计算机科学大学),连接速度并不慢,但仅限于数量。因此,分组数据的优势很大 –