使用带有矢量切片的 MBTiles 进行离线地理编码
Offline geocoding using MBTiles with vector tiles
我使用 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 拥有他体内的所有信息,但我如何才能访问该信息??
这可能吗??如果可以,我该怎么做?
CARTO 移动 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 tiles 没有完整的数据,它针对视觉外观进行了优化。例如,建筑物或地址点可能有门牌号标签,但其中几乎没有街道或城市和国家/地区数据,因为这对于视觉地图来说是多余的并且不需要。现在对于文字地理编码,CARTO SDK 也有解决方案:NTGeocodingService。您可以在线或离线使用此功能,只是对于离线情况而言,SDK 必须为每个国家(或城市,如果需要)下载 特殊的不同数据包 。这些数据包具有完整的分层地址数据,因此真正的地理编码可以与它们一起使用。因此,对于完整的离线数据,您需要分别获取两个离线包:用于地图的 mbtiles 和地理编码数据库。如果您还想要离线路由,那么第三个数据集,因为这也不能仅从 mbtiles/vector 个图块中正确完成。
这是一个非常新的功能,因此您需要使用 SDK 的预发布版本,但非常欢迎您的反馈。
我使用 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 拥有他体内的所有信息,但我如何才能访问该信息??
这可能吗??如果可以,我该怎么做?
CARTO 移动 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 tiles 没有完整的数据,它针对视觉外观进行了优化。例如,建筑物或地址点可能有门牌号标签,但其中几乎没有街道或城市和国家/地区数据,因为这对于视觉地图来说是多余的并且不需要。现在对于文字地理编码,CARTO SDK 也有解决方案:NTGeocodingService。您可以在线或离线使用此功能,只是对于离线情况而言,SDK 必须为每个国家(或城市,如果需要)下载 特殊的不同数据包 。这些数据包具有完整的分层地址数据,因此真正的地理编码可以与它们一起使用。因此,对于完整的离线数据,您需要分别获取两个离线包:用于地图的 mbtiles 和地理编码数据库。如果您还想要离线路由,那么第三个数据集,因为这也不能仅从 mbtiles/vector 个图块中正确完成。
这是一个非常新的功能,因此您需要使用 SDK 的预发布版本,但非常欢迎您的反馈。