2017-09-26 118 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分鐘,如果連接沒有漏掉。當我工作時(在計算機科學大學),連接速度並不慢,但僅限於數量。因此,分組數據的優勢很大 –