2012-09-07 33 views
1

我正在開發iOS 5應用程序,我想與服務器進行通信,以提供有關給定位置附近地點的信息:地點位置和註釋。我想用MapKit來填充我的地圖和這些信息。Mapkit。從服務器獲取附近地點並可能緩存它們(例如,用於離線使用)

我沒有找到關於下列問題的任何直接的信息:

  1. 不MapKit有瓷磚的功能(谷歌地圖的方式)外的開箱和我需要它額外的工作,如果不?
  2. 從服務器檢索地點信息(標記位置和註釋)的最佳做法是什麼?
  3. 是否可以緩存此信息,以便用戶可以在離線模式下查看「他的城市」的附近地點?

其實問題2和問題3是相互關聯的:它們都解決了不檢索已經在地圖上多次的信息(位置+註釋)的問題。

希望我不會在這裏看到明顯的東西。

謝謝!

更新1 :(關於地點,而不是地圖)更具體地說,我感興趣的是,我應該如何爲包含我從服務器獲取地點的區域創建「手工製作」的邏輯磁貼,以便它們不需要重新設置當用戶滾動地圖時他們自己?我知道我可以自己實現這個功能。例如,我應該在獲取它們還是組織一些隊列後立即使用核心數據寫入剛抓到本地存儲的地方?或者我怎麼能知道什麼時候需要對服務器上的特定區域執行請求,以及何時只是獲取設備上已有的本地數據?我只想知道,有沒有推薦的方法,最佳實踐?希望我在這裏寫得很清楚。

更新2:我想知道這裏的最佳實踐(鏈接,示例)不要從頭開始創建所有這些(點2 + 3)。有沒有任何框架包裝這個或很好的教程?

回答

0

現在是時候爲我的問題寫一個可靠的答案了(我可以在一年前寫下它,但不知何故,我從頭腦中將它遺失了)。


不MapKit有瓷磚的功能(谷歌地圖的方式)外的開箱和我需要在其上附加工作,如果不是?

答案是肯定的:MapKit確實有。這裏的關鍵字是overlays (MKOverlay, MKOverlayView and others)。見my another answer

參見:

WWDC 2010 Session: Customizing Maps with Overlays

Apple-WWDC10-TileMap


什麼是從服務器獲取信息的地方(標記位置和註釋)的最佳實踐?

其實從那時起,我沒有學到了很多關於「最佳做法」 - 不幸的是,沒人告訴我關於他們:( - 這就是爲什麼我將介紹「我的做法」

首先的。有填充一個MapKit地圖與地方兩種策略:

第一戰略是有關填充您與需求的地方地圖:想象你想顯示和看到所有附近的地方(例如,不超過距離當前用戶位置1公里) - 這種方法假定你只向你的服務器詢問你所在的盒子的位置這意味着這樣的意思:「如果我在柏林(我預計柏林有200個名額),爲什麼我應該從俄羅斯,日本......(10000多個地方)拿到這些地方」。

這種方法導致依賴於「瓷磚」功能的問題N1地址:谷歌地圖和蘋果地圖通常使用「瓷磚」繪製,因此對於您依賴相應的「柏林」瓷磚地圖中的「柏林」部分地圖由MKMapView繪製 - 您使用它們的尺寸,向服務器詢問「柏林」框中的位置(請參閱我的鏈接答案和演示應用程序)。

最初這是我用過的方法,我的實現工作完美,但後來我被推到使用第二種方法(見下文),因爲出現了聚類問題。

第二種策略是一次獲取所有的地方(是的,這一切10000+以上),並使用核心數據來獲取所需您有興趣地圖的可視部分的地方。

第二種方法意味着,在第一次運行期間,您向服務器發送請求以獲取所有地方(我的應用中約有2000個地方)。此處重要的是,您只能將要獲取的字段限制爲地圖上真正需要的地理區域:idlatitudelongitude。 (「最老的」iPhone 4,我有整個Fetch + Parse-JSON-into-Core-Data過程接近700毫秒,並且廣泛的基準測試顯示我它是核心數據及其插入是瓶頸),但您可以獲得有關您設備上的地點的所有重要地理信息。

注意,你用什麼策略,你應該做有效獲取這些地理點的過程:

想象核心數據實體Place它具有以下字段結構(preudo-Objective-C代碼) :

// Unique identificator 
NSNumber *id, 

// Geo info 
NSNumber *latitude, 
NSNumber *longitude, 

// The rest "heavy" info 
NSString *name, 
NSString *shortDescription, 
NSString *detailedDescription, etc 

抓取的地方有效地意味着你從你的服務器只問你的地方記錄地理數據,使這個鏡像儘可能快的過程。

另請參見熱門話題:Improve process of mirroring server database to a client database via JSON?

聚類問題超出了這個問題的範圍,但仍然非常相關,並影響整個過程中使用的整個算法 - 我將留在這裏的唯一注意事項是所有當前現有的聚類解決方案都需要你需要使用第二種策略 - 在運行聚合算法之前,你必須準備好所有的地方,這些算法將組織地圖上的地點 - 這意味着如果決定使用聚類,則必須使用策略#2。聚類

相關鏈接:

WWDC 2011 Session: Visualizing Information Geographically with MapKit

How To Efficiently Display Large Amounts of Data on iOS Maps

kingpin - 開源的集羣解決方案:高性能和易於使用。


是否有可能緩存此信息,這樣的用戶就可以看到「他的城」在離線模式下附近的地方呢?

是,這兩種戰略做到這一點:第一個緩存您在地圖上看到的地方 - 如果你觀察地圖的柏林的一部分,你將有柏林部分緩存...

當使用第二個策略:您將擁有緩存的所有關於地點的重要地理信息,並且可以在離線模式下在地圖上繪製(假設MapKit緩存了您在離線模式下瀏覽的地區的地圖圖像)。

0

@Stanislaw - 我們已經在我們的一個客戶的應用程序PreventConnect中實現了您描述的功能。客戶端已經有一些數據存儲在Google Fusion表格中。我們通過添加另一個Google Fusion表格來擴展其現有解決方案,該表格存儲多個位置的地理座標。所有這些說,回答你的問題...

1)地圖部分本身是開箱即用,瓷磚和什麼不是,但你需要做一些編碼來獲得放大範圍,引腳滴,註釋以及類似於您希望他們工作的方式工作。

2)我們發現Google Fusion解決方案非常有效。如果您不想使用Google Fusion,則還有其他雲數據庫提供商,如StackMob,database.com等等。谷歌是免費的,他們有一個iOS SDK,使得與Google Fusion的溝通非常簡單。

3)絕對!我們將大部分數據緩存在設備本地的Core Data存儲中。這大大提高了性能和響應速度。

+0

rasesix,謝謝你的回答。我發現它太模糊了。在第二點 - 我不需要使用數據庫提供者 - 我有一個遠程服務器:我使用它的API獲取關於它的位置的信息(因此GF字符串完全不相關)。第1點 - 就是當我問我的問題時,我腦海中所想的 - 你剛剛通過思考確認,謝謝。第3點 - 我很可能對知道其熟知的方法感興趣。我用更多的細節更新了我的問題 - 希望能夠以更清晰的方式描述我想要的內容。 –

+0

radesix,在寫下你的名字時很抱歉拼寫錯誤。 –

相關問題