ถึงเวลาเขียนคำตอบที่ชัดเจนสำหรับคำถามของฉันนี้ (ฉันสามารถเขียนได้เมื่อปีที่แล้ว แต่อย่างใดฉันก็ลืมมันไปจากใจ)
MapKit มีฟังก์ชันการทำงานแบบแยกส่วน (แบบ Google Maps) นอกกรอบหรือไม่ และฉันจำเป็นต้องแก้ไขเพิ่มเติมหรือไม่ หากไม่
คำตอบคือใช่: MapKit มีอยู่ คำหลักที่นี่คือ overlays (MKOverlay, MKOverlayView and others)
ดูคำตอบอื่นของฉัน
ดูสิ่งนี้ด้วย:
เซสชัน WWDC 2010: การปรับแต่งแผนที่ด้วยภาพซ้อนทับ,
Apple-WWDC10-TileMap
แนวปฏิบัติที่ดีที่สุดในการดึงข้อมูลสถานที่ (ตำแหน่งเครื่องหมายและคำอธิบายประกอบ) จากเซิร์ฟเวอร์คืออะไร
จริงๆ แล้วตั้งแต่นั้นมา ฉันไม่ได้เรียนรู้มากนักเกี่ยวกับ "แนวทางปฏิบัติที่ดีที่สุด" - น่าเสียดายที่ไม่มีใครบอกฉันเกี่ยวกับสิ่งเหล่านั้น :( - นั่นคือเหตุผลที่ฉันจะอธิบาย "แนวทางปฏิบัติของฉัน"
ประการแรก มีสองกลยุทธ์ในการเติมแผนที่ MapKit ด้วยสถานที่ต่างๆ:
กลยุทธ์แรกคือการเติมสถานที่ลงในแผนที่ของคุณตามความต้องการ: ลองจินตนาการว่าคุณต้องการแสดงและดูสถานที่ใกล้เคียงทั้งหมด (เช่น ไม่เกิน 1 กม. จากตำแหน่งปัจจุบันของผู้ใช้) - วิธีการนี้จะถือว่าคุณ ถามเซิร์ฟเวอร์ของคุณเฉพาะสถานที่สำหรับกล่องที่คุณสนใจ ซึ่งหมายถึง "ถ้าฉันอยู่ในเบอร์ลิน (และคาดว่าจะมีที่ 200 แห่งสำหรับเบอร์ลิน) ทำไมฉันต้องไปรับสถานที่จากรัสเซีย ญี่ปุ่น .. . (มากกว่า 10,000 แห่ง)"
แนวทางนี้นำไปสู่การอาศัยฟังก์ชัน "ไทล์" ที่ตั้งคำถามเกี่ยวกับที่อยู่ N1: โดยปกติแล้วแผนที่ของ Google และแผนที่ของ Apple จะถูกวาดโดยใช้ "ไทล์" ดังนั้นสำหรับส่วน "เบอร์ลิน" ของแผนที่ คุณจะต้องใช้ไทล์ "เบอร์ลิน" ที่เกี่ยวข้องซึ่งวาดโดย MKMapView - คุณใช้มิติข้อมูลเพื่อถามเซิร์ฟเวอร์ของคุณเฉพาะสถานที่ภายในกล่อง "เบอร์ลิน" (ดูคำตอบที่เชื่อมโยงของฉันและแอปสาธิตที่นั่น)
ในตอนแรกนี่เป็นแนวทางที่ฉันเคยใช้และการนำไปใช้งานของฉันก็ทำงานได้อย่างสมบูรณ์แบบ แต่ต่อมาฉันถูกผลักดันให้ใช้แนวทางที่สอง (ดูด้านล่าง) เนื่องจากปัญหาของการจัดกลุ่มปรากฏขึ้น
กลยุทธ์ที่สอง คือการดึงสถานที่ทั้งหมดในคราวเดียว (ใช่ ทั้งหมดนี้มากกว่า 10,000 แห่งขึ้นไป) และใช้ข้อมูลหลักเพื่อดึงสถานที่ที่จำเป็นสำหรับส่วนที่มองเห็นได้ของแผนที่ที่คุณสนใจ
แนวทางที่สองหมายความว่าในระหว่างการรันครั้งแรก คุณส่งคำขอเซิร์ฟเวอร์ของคุณเพื่อดึงข้อมูลสถานที่ทั้งหมด (ฉันมีประมาณ 2,000 แห่งในแอปของฉัน) สิ่งสำคัญที่นี่คือ คุณต้องจำกัดฟิลด์ที่คุณดึงข้อมูลไว้เฉพาะพื้นที่ทางภูมิศาสตร์ที่คุณต้องการจริงๆ สำหรับแผนที่ของคุณ: id
, latitude
, longitude
การดึงข้อมูลแบบ 'ดึงข้อมูลทั้งหมด' นี้มีผลกระทบอย่างมากต่อเวลาเริ่มต้นครั้งแรกของแอปของฉัน (ใน iPhone 4 ที่ "เก่าที่สุด" ฉันมีเวลาเกือบ 700ms สำหรับกระบวนการ Fetch + Parse-JSON-into-Core-Data
ทั้งหมด และการวัดประสิทธิภาพที่ครอบคลุมแสดงให้ฉันเห็นว่า นี่คือข้อมูลหลักและ ส่วนแทรกนั้นเป็นคอขวด) แต่จากนั้นคุณก็จะมีข้อมูลทางภูมิศาสตร์ที่จำเป็นทั้งหมดเกี่ยวกับสถานที่ของคุณบนอุปกรณ์ของคุณ
โปรดทราบว่าไม่ว่าคุณจะใช้กลยุทธ์ใดก็ตาม คุณควรดำเนินการดึงข้อมูลจุดทางภูมิศาสตร์เหล่านี้อย่างมีประสิทธิภาพ:
ลองนึกภาพเอนทิตี Core Data 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
การดึงข้อมูลสถานที่อย่างมีประสิทธิภาพหมายความว่าคุณขอให้เฉพาะสถานที่ของคุณบันทึกข้อมูลทางภูมิศาสตร์จากเซิร์ฟเวอร์ของคุณ เพื่อให้กระบวนการมิเรอร์นี้เร็วที่สุดเท่าที่จะเป็นไปได้
ดูหัวข้อยอดนิยมนี้ด้วย: ปรับปรุงกระบวนการฐานข้อมูลเซิร์ฟเวอร์มิเรอร์ไปยังฐานข้อมูลไคลเอนต์ผ่าน JSON หรือไม่
ปัญหาการจัดกลุ่มอยู่นอกขอบเขตของคำถามนี้ แต่ยังคงมีความเกี่ยวข้องมากและส่งผลต่ออัลกอริทึมทั้งหมดที่คุณใช้สำหรับกระบวนการทั้งหมด - หมายเหตุเดียวที่ฉันจะทิ้งไว้ที่นี่คือโซลูชันการจัดกลุ่มที่มีอยู่ในปัจจุบันทั้งหมดจะ ต้องการให้คุณใช้กลยุทธ์ที่สอง - คุณต้องเตรียมสถานที่ทั้งหมดก่อนที่คุณจะพบกับอัลกอริธึมการจัดกลุ่มที่จะจัดระเบียบสถานที่ของคุณบนแผนที่ - หมายความว่าหากคุณตัดสินใจใช้การจัดกลุ่มคุณต้องใช้กลยุทธ์ #2
ลิงก์ที่เกี่ยวข้องในการจัดกลุ่ม:
เซสชัน WWDC 2011: การแสดงภาพข้อมูลทางภูมิศาสตร์ด้วย MapKit,
วิธีแสดงข้อมูลจำนวนมากบน iOS อย่างมีประสิทธิภาพ แผนที่,
สิ่งสำคัญ - โซลูชันการทำคลัสเตอร์แบบโอเพนซอร์ส: มีประสิทธิภาพและใช้งานง่าย
เป็นไปได้ไหมที่จะแคชข้อมูลนี้เพื่อให้ผู้ใช้สามารถเห็นสถานที่ใกล้เคียงของ "เมืองของเขา" ในโหมดออฟไลน์
ใช่ ทั้งสองกลยุทธ์ทำเช่นนี้: วิธีแรกแคชสถานที่ที่คุณเห็นบนแผนที่ของคุณ - หากคุณสังเกตเห็นส่วนของแผนที่เบอร์ลิน คุณจะมีส่วนของเบอร์ลินถูกแคช...
เมื่อใช้กลยุทธ์ที่สอง: คุณจะมีข้อมูลทางภูมิศาสตร์ที่จำเป็นทั้งหมดเกี่ยวกับสถานที่ของคุณที่แคชไว้และพร้อมที่จะวาดบนแผนที่ในโหมดออฟไลน์ (สมมติว่า MapKit แคชภาพแผนที่ของภูมิภาคที่คุณเรียกดูในโหมดออฟไลน์)
person
Stanislav Pankevich
schedule
26.01.2014