使用带有矢量切片的MBTiles进行离线地理编码

时间:2017-09-26 11:46:04

标签: ios swift geocoding mbtiles carto-mobile

我使用carto-mobile SDK加载了我国家的 MBTiles Vector Tile 数据源

    // 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里面有他的所有信息,但我怎样才能访问该信息?

这是真的吗?如果有可能,我该怎么做?

1 个答案:

答案 0 :(得分:0)

CARTO移动SDK的最新版本(4.1.0)使用mbtiles NTVectorTileSearchService 。目前还没有用户文档,但可以从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 for maps和geocoding database。如果你也想要离线路由,那么第三个数据集,因为这也无法单独从mbtiles / vector tile中正确完成。

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