MKMapView ซูมและภูมิภาค


85

ฉันคุ้นเคยกับการใช้ Google Maps Javascript API เมื่อเร็ว ๆ นี้ฉันเริ่มใช้ MapKit framework สำหรับโปรเจ็กต์ iphone แต่ฉันมีช่วงเวลาที่ยากลำบากในการค้นหาการซูมและตั้งค่าภูมิภาคบนแผนที่

ใน Google Maps API ฉันเคยใช้ระดับการซูมจำนวนเต็มเช่น 8, 9, 10 พร้อมกับฟังก์ชันที่ตรงไปตรงมา setZoom () วิธีเดียวที่ฉันเห็นในกรอบ MapKit คือ setRegion: animated ตามที่ฉันเข้าใจฉันจำเป็นต้องตั้งค่าละติจูดและลองจิจูดของพื้นที่เพื่อระบุระดับการซูม แต่ฉันไม่รู้จริงๆว่าค่าเหล่านี้แสดงถึงอะไร (ฉันอ่านเอกสารประกอบ)

เมื่อฉันใช้ผู้รับมอบสิทธิ์ MKMapView และติดตามค่าสแปนใน regionDidChange ผลลัพธ์ของเมธอดผู้ร่วมประชุมดูเหมือนจะไม่สัมพันธ์กัน เป็นเรื่องปกติเมื่อฉันซูมออกและเห็นว่าค่าเดลต้าขยายเพิ่มขึ้นตามที่ระบุไว้ในเอกสารประกอบ แต่ทันใดนั้นฉันลากแผนที่โดยไม่ซูมและค่าเดลต้ากลายเป็น 0.0

ใครช่วยอธิบายได้ไหมว่าอะไรคือจุดอ้างอิงของช่วงและเดลต้าเหล่านี้ หรือมีอัลกอริทึมใดในการแปลงระดับการซูมจำนวนเต็ม (เช่น 9) เป็นค่าเดลต้าเหล่านี้หรือไม่

เป็นคำถามโบนัสมีวิธีใดในการระบุระดับการซูมสูงสุดขั้นต่ำบน MKMapView :)

ขอบคุณ

คำตอบ:


134

ประการแรกMKMapViewไม่ได้ใช้ / มีชุดระดับการซูมที่กำหนดไว้ล่วงหน้าเช่นเดียวกับ Google Maps

แทนพื้นที่ที่มองเห็นได้ของ MKMapView จะอธิบายโดยใช้MKCoordinateRegionซึ่งประกอบด้วยสองค่า:

  1. center (จุดกึ่งกลางของภูมิภาค) และ
  2. ช่วง (ขนาดของพื้นที่ที่มองเห็นได้รอบ ๆ ศูนย์กลาง)

จุดกึ่งกลางควรชัดเจน (เป็นจุดกึ่งกลางของภูมิภาค)

อย่างไรก็ตามช่วง (ซึ่งเป็นMKCoordinateSpan ) ประกอบด้วย:

  1. latitudeDelta (ระยะทางแนวตั้งแสดงโดยภูมิภาค) และ
  2. longitudeDelta (ระยะทางแนวนอนแสดงโดยภูมิภาค)

ตัวอย่างสั้น ๆ นี่คือของเล่น MKCoordinateRegion:

  1. ศูนย์:
    • ละติจูด: 0
    • ลองจิจูด: 0
  2. ช่วง:
    • ละติจูดเดลต้า: 8
    • ลองจิจูดเดลต้า: 6

ภูมิภาคนี้สามารถอธิบายได้โดยใช้พิกัดต่ำสุดและสูงสุดดังนี้:

  1. พิกัดขั้นต่ำ (จุดล่างซ้าย):
    • ละติจูด: -4
    • ลองจิจูด: -3
  2. พิกัดสูงสุด (จุดขวาบน):
    • ละติจูด: 4
    • ลองจิจูด: 3

ดังนั้นคุณสามารถระบุระดับการซูมรอบ ๆ จุดศูนย์กลางได้โดยใช้ MKCoordinateSpan ที่มีขนาดเหมาะสม ในการประมาณระดับการซูมที่เป็นตัวเลขของ Google คุณสามารถทำวิศวกรรมย้อนกลับขนาดสแปนที่ Google ใช้สำหรับระดับการซูมที่กำหนดและสร้างช่วงตามนั้น (Google อธิบายขอบเขตมุมมองของพวกเขาในลักษณะเดียวกับที่ MKMapView เป็นศูนย์กลาง + สแปนดังนั้นคุณสามารถดึงค่าเหล่านี้ออกจาก Google แผนที่ได้)

สำหรับการ จำกัด ภูมิภาคคุณสามารถเล่นด้วยวิธีการมอบสิทธิ์นี้:

mapView:regionWillChangeAnimated

เช่นการปรับขนาดพื้นที่กลับเป็นระดับการซูมที่คุณอนุญาต (เช่นเดียวกับการที่มุมมองตารางจะช่วยให้คุณเลื่อนผ่านขอบ แต่จะรัดยางกลับเข้าที่) อย่างไรก็ตามระยะทางของคุณอาจแตกต่างกันไปเนื่องจากฉันไม่ได้ใช้เพื่อจุดประสงค์นี้

btw มีการแก้ไข / ปรับปรุงที่ชัดเจนใน OS 3.1 ในแง่มุมของ MapKit ที่ทำให้ฉันมีปัญหาใน 3.0


@Kelvin คุณสามารถอธิบายรายละเอียดเพิ่มเติมเกี่ยวกับวิธี "ทำวิศวกรรมย้อนกลับขนาดช่วงที่ Google ใช้สำหรับระดับการซูมที่กำหนดและสร้างช่วง" ฉันต้องการมันจริงๆ
Scofield Tran

118

หากคุณต้องการใช้ระดับการซูมที่ชัดเจนแทนการกำหนด MKCoordinateSpan ฉันเขียนหมวดหมู่ที่เพิ่มการรองรับสำหรับการระบุระดับการซูมของ MKMapView รหัสที่สามารถพบได้ที่นี่


4
บล็อกโพสต์ของ Troy ทำให้ฉันมีความเข้าใจอย่างมากว่า mapkit และ Google Maps ทำงานอย่างไร ฉันขอแนะนำให้อ่าน
แอรอน

5
git: //github.com/jdp-global/MKMapViewZoom.git
johndpope

5

สแปนมีหน่วยเป็นองศาละติจูดและลองจิจูด มีวิธีการสร้างโครงสร้าง MKCoordinateRegion ที่ใช้ระยะทางแทน อาจเป็นไปได้ว่าคุณกำลังใช้ MKCoordinateRegionMakeWithDistance เพื่อระบุช่วงเวลาจากนั้นเมื่อคุณตรวจสอบใน regionDidChange คุณจะเห็นช่วง lat / long ซึ่งเป็นวิธีการจัดเก็บในโครงสร้าง MKCoordinateRegion

เท่าที่ฉันทราบระดับการซูมจำนวนเต็มไม่สามารถใช้งานได้หรือมีประโยชน์เลยเมื่อทำงานกับ MKMapKit โดยส่วนตัวแล้วฉันชอบใช้ตัวเลขช่วงมากกว่าซึ่งมีความยืดหยุ่นมากกว่า

คุณไม่สามารถระบุการซูมสูงสุดและต่ำสุดได้และฉันไม่รู้วิธีแฮ็คมัน MKMapKit ตอนนี้ค่อนข้างอ่อนแอฉันค่อนข้างผิดหวังกับการขาดคุณสมบัติ


3

การเปรียบเทียบระดับการซูมอย่างรวดเร็วสำหรับสถานที่โดยใช้ maps.google.com โดยการตรวจสอบสตริงการสืบค้นลิงก์แสดงให้เห็นว่าค่า dx และ dy span เพิ่มขึ้นโดยปัจจัย 2:

 (0.005334, 0.011834) starting span
 (0.010668, 0.023668) dx: x2, dy: x2 
 (0.021335, 0.047337) dx: x2, dy: x2
 (0.042671, 0.094671) dx: x2, dy: x2
  ...

2

หมวดหมู่ของ Brant บน MKMapView ทำงานได้ดี อย่างไรก็ตามดูเหมือนว่าจะไม่ได้รับการอัปเดตเพื่อรองรับอุปกรณ์รุ่นใหม่ที่มีหน้าจอเรตินาเมื่อคำนวณ mapSizeInPixels

สามารถแก้ไขได้โดยแทนที่บรรทัดนี้:

CGSize mapSizeInPixels = mapView.bounds.size;

ด้วยบรรทัดนี้:

CGSize mapSizeInPixels = CGSizeMake(mapView.bounds.size.width * [UIScreen mainScreen].scale, mapView.bounds.size.height * [UIScreen mainScreen].scale);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.