現在是時候爲我的問題寫一個可靠的答案了(我可以在一年前寫下它,但不知何故,我從頭腦中將它遺失了)。
不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個地方)。此處重要的是,您只能將要獲取的字段限制爲地圖上真正需要的地理區域:id
,latitude
,longitude
。 (「最老的」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緩存了您在離線模式下瀏覽的地區的地圖圖像)。
rasesix,謝謝你的回答。我發現它太模糊了。在第二點 - 我不需要使用數據庫提供者 - 我有一個遠程服務器:我使用它的API獲取關於它的位置的信息(因此GF字符串完全不相關)。第1點 - 就是當我問我的問題時,我腦海中所想的 - 你剛剛通過思考確認,謝謝。第3點 - 我很可能對知道其熟知的方法感興趣。我用更多的細節更新了我的問題 - 希望能夠以更清晰的方式描述我想要的內容。 –
radesix,在寫下你的名字時很抱歉拼寫錯誤。 –