Автономное геокодирование с использованием MBTiles с векторными плитками
Я загружаю источник данных MBTiles Vector Tile моей страны, используя carto-mobile SDK
// 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 ответ
В последней версии (4.1.0) мобильного SDK CARTO 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 / vector.
Это очень новая функция, поэтому вам нужно использовать предварительную версию SDK, но ваши отзывы очень приветствуются.