วิธีคำนวณกล่อง bounding ของหลาย ๆ ชั้นใน lat / long?


11

ฉันกำลังเขียนแอปพลิเคชันเพื่อทดสอบประสิทธิภาพของบริการแผนที่ทุกประเภทส่วนใหญ่ AGS 9.x, AGS 10 และ WMS 1.x

ส่วนหนึ่งของแอปพลิเคชันเกี่ยวข้องกับการสร้างกล่องขอบเขตแบบสุ่มสำหรับคำขอส่วนบุคคลภายในขอบเขตทั้งหมดของบริการ ส่วนนี้ทำงานได้ดีสำหรับระบบพิกัดทางภูมิศาสตร์และที่คาดการณ์ไว้เมื่อทราบขอบเขตทั้งหมดของบริการ (เช่นผ่านคุณสมบัติ fullExtent ของบริการ AGS)

ปัญหาของฉันคือ WMS: แต่ละเลเยอร์ในการตอบกลับของ GetCapabilities สามารถกำหนดขอบเขตของขอบเขตใน> = 1 CRS บางส่วนของแอปพลิเคชั่นจำเป็นต้องรู้ว่า CRS ของบริการเป็นพื้นที่ทางภูมิศาสตร์หรือที่คาดการณ์ไว้ดังนั้นเพื่อที่จะลบความคลุมเครือใน WMS ฉันมักจะใช้ LatLonBoundingBox ของเลเยอร์ซึ่งกำหนดไว้เสมอและใน EPSG: 4326 จากนั้นฉันต้องคำนวณขอบเขตของบริการเต็มรูปแบบโดยยึดตามเลเยอร์ทั้งหมดที่เข้าสู่คำขอส่วนบุคคล (ซึ่งถูกสุ่ม) นี่คือที่ที่มันจะยุ่งยาก

ฉันหลงทางเพราะในแต่ละกล่อง lat / lon bounding LLx (ลองจิจูดซ้ายล่าง) อาจเป็นจำนวนที่ใหญ่กว่าหรือเล็กกว่า URx (ลองจิจูดบนขวา) ขึ้นอยู่กับว่าเส้นเมอริเดียนมันอยู่ในช่วงใด ทุกครั้งที่ฉันเริ่มวาดรูปสี่เหลี่ยมจัตุรัสหรือไดอะแกรมวงกลมฉันคิดว่าฉันมีวิธีคิดแล้วหากรณีที่ซากปรักหักพังและสมองของฉันกลายเป็นข้าวต้ม

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


ตกลงดังนั้นในบทความนี้: stonybrook.edu/libmap/coordinates/seriesa/no2/a2.htm (ส่วน Global Gotchas) ฉันอ่าน "น่าเสียดายที่ไม่มีวิธีแก้ปัญหาที่ง่ายและสง่างามในการแก้ปัญหา Gotchas ทั่วโลก" ฉันกำลังคิดว่าจะสแกนส่วนขยายเลเยอร์ทั้งหมดและถ้า URx <LLx ตั้งค่าขอบเขตเป็น -180 +180 บทความเดียวกันแสดงให้เห็นว่า GIS ส่วนใหญ่จะแบ่งรูปหลายเหลี่ยมที่มีพิกัดเหล่านี้เป็นสองคุณสมบัติแยกต่างหาก
tomfumb

คำหลักเพิ่มเติมสำหรับเครื่องมือค้นหาเนื่องจากฉันมีปัญหาในการค้นหาโพสต์ที่ยอดเยี่ยมนี้อีกครั้ง: กล่องขอบเขตขั้นต่ำ, การรวมกล่องที่มีขอบเขตหลายบรรทัด, วันที่สากล, ความไม่ต่อเนื่อง, ส่วนวงกลมขั้นต่ำ
letmaik

คำตอบ:


6

บทความที่อ้างอิงมีน้ำใจ แต่ผมเชื่อว่ามีคือ "ความง่ายและสง่างาม" การแก้ปัญหา: สำหรับชุดข้อมูลทางภูมิศาสตร์ที่มีสองชนิดกล่อง bounding ผู้ที่ไม่ได้นั่งบน + -180 เที่ยงจะสามารถเก็บและค้นหาได้เช่นเคย ผู้ที่กำลังปั่นป่วน + -180 meridian สามารถเก็บไว้ในรูปแบบกึ่งเสริม : กล่าวคือเก็บช่วงของละติจูดตามปกติ แต่แทนที่จะเก็บช่วงของลองจิจูดที่ไม่รวมอยู่ในกล่อง (และสลับบิตเพื่อระบุว่ารูปแบบใด กำลังใช้พื้นที่เก็บข้อมูล) โดยพื้นฐานแล้วไม่จำเป็นต้องทำการดัดแปลงใด ๆ กับดัชนีทางภูมิศาสตร์หรือโครงสร้างแผนผังการค้นหา อัลกอริธึมการค้นหาเพียงเล็กน้อยเท่านั้น

ไม่ว่าจะด้วยวิธีใดก็ตามนี่เป็นคำตอบสำหรับคำถาม


ฉันคิดว่าคุณคาดหวังว่าการป้อนข้อมูลเป็นลำดับของตัวอธิบายกล่องขอบ ((LLx, LLy), (URx, URy)) โดยที่:

  • -540 <= LLx, -180 <= URx, LLx <= 180 และ URx <= 180 นอกจากนี้ -90 <= LLy <= URy <= 90

  • จุดที่ (ลองจิจูด, ละติจูด) = (x, y) ถูกพิจารณาว่าอยู่ใน BB ถ้าหาก

    1. LLy <= y <= URy และ

    2. อาจเป็น LLx <= x <= URx หรือ LLx - 360 <= x <= URx

สำหรับเอาต์พุตคุณต้องการพารามิเตอร์สำหรับกล่อง bounding ที่เล็กที่สุดที่มีการรวมกันของอินพุตทั้งหมด

เห็นได้ชัดว่าค่า จำกัด y ของกล่องขอบเขตต่ำสุด (MBR) จะเป็นค่าต่ำสุดและสูงสุดของค่า y สำหรับ x วงเงินใช้กวาดเส้นเพื่อหาช่องว่างที่ใหญ่ที่สุด

นี่คือคำอธิบายของอัลกอริทึม เพื่อแสดงให้เห็นว่าสมมติว่าการป้อนข้อมูลประกอบด้วยสี่กล่อง

((-81,-16),(-77,80)),
((77,-19),(156,5)),
((-149,-45),(-90,81)),
((-69,-85),(-36,-76))

นี่คือแผนภาพของกล่อง (สีแดง) และ MBRs (เป็นสีดำ) ของกล่องแรกจากนั้นสองกล่องแรกจากนั้นกล่องแรกจะเป็นกล่องสามกล่อง

ป้อนคำอธิบายรูปภาพที่นี่

โปรดสังเกตว่าในขั้นตอนที่สองกล่องในซีกโลกตะวันออกและตะวันตกนั้นล้อมรอบด้วย MBR ซึ่งข้ามเส้นแวง + -180 องศาทำให้มันปรากฏเป็นกล่องสองแยกบนแผนที่นี้ ในขั้นตอนสุดท้าย MBR นั้นจะต้องถูกขยายไปทางตะวันออกเพื่อรองรับกล่องเล็ก ๆ ระหว่างอเมริกาใต้และแอนตาร์กติกา

  1. แยกพิกัด x ทั้งหมดของกล่องคำนวณหาโมดูโล 360 (เพื่อวางไว้ในช่วง -180..180) เรียงลำดับจากน้อยไปหามากและผนวกค่าแรก (เพิ่มขึ้น 360 องศา) ต่อท้ายเพื่อทำให้ห่อ รอบ:

    -149, -90, -81, -77, -69, -36, 77, 156, 211
    

    (โปรดสังเกตว่า 211 และ -149 เป็นเมริเดียนเดียวกัน)

  2. คิดว่าแต่ละพิกัด x เป็นตัวแทนช่วงเวลาระหว่างพิกัดก่อนหน้า (แต่ไม่รวมถึงค่าก่อนหน้า) และมัน เช่น -77 หมายถึงค่าทั้งหมดตั้งแต่ -81 ถึง -77 แต่ไม่รวมถึง -81 สำหรับแต่ละกล่องหลังจากแรกให้นับจำนวนกล่องที่มีช่วงเวลานั้น

    1, 0, 1, 0, 1, 0, 1, 0
    

    ตัวอย่างเช่น "1" แรกหมายความว่าหนึ่งกล่องครอบคลุมช่วงตั้งแต่ -149 ถึง -90 (นี่คือกล่องที่สาม)

    เป็นการเพิ่มประสิทธิภาพคุณสามารถหยุดการนับทันทีที่พบกล่องใด ๆ ที่ครอบคลุมช่วง x และเลื่อนไปยังช่วง x ถัดไป เราพยายามกำหนดช่วงเวลาที่อาจไม่ครอบคลุมโดยกล่องใด ๆ

  3. คำนวณความแตกต่างแรกของพิกัด x ที่เรียงใน (1)

     59, 9, 4, 8, 33, 113, 79, 55
    

    จับคู่เหล่านี้กับความครอบคลุมใน (2) ค้นหาความแตกต่างที่ใหญ่ที่สุดที่จำนวนการครอบคลุมคือ 0 ตรงนี้มันเท่ากับ113องค์ประกอบที่หกของอาเรย์ก่อนหน้า นี่คือช่องว่างที่ยิ่งใหญ่ที่สุดในลองจิจูดที่เหลือจากชุดของกล่อง

    (น่าสนใจความเป็นไปได้สูงสุดที่เกิดขึ้นมากกว่าหนึ่งตำแหน่งแสดงให้เห็นว่าการแก้ปัญหาไม่จำเป็นต้องไม่ซ้ำกัน! อาจมีมากกว่าหนึ่ง MBR สำหรับชุดของกล่องคุณสามารถกำหนดหนึ่งที่ไม่ซ้ำกันโดยการเพิ่มเงื่อนไขเพิ่มเติมเช่นต้องการ ระยะทางเฉลี่ยใน MBR ถึง + -180 เมอริเดียนนั้นใหญ่ที่สุดเท่าที่จะทำได้เพื่อแก้ปัญหาให้เลือก (พูด) ทางออกตะวันออกสุด

  4. ค้นหาช่วงเวลาที่เกี่ยวข้อง: ที่นี่มาจาก -36 ถึง 77 นี่คือช่วงของลองจิจูดที่ไม่ได้อยู่ใน MBR ดังนั้นเติมเต็มในช่วงจาก -180 ถึง 180 ที่นี่ส่วนเติมเต็มคือช่วงเวลาแยกสองช่วงหนึ่งช่วงจาก -180 ถึง -36 และอีกช่วงจาก 77 ถึง 180 อีกวิธีหนึ่งแทนส่วนประกอบที่เป็นสี่เหลี่ยมเดียวอาจคร่อมเครื่องหมาย + -180 องศาเมริเดียน: จาก -283 ถึง -36 ที่นี่ (หรือเทียบเท่าจาก 77 ถึง 324)

  5. ใช้ min และ max ของค่า y สำหรับมุมของ MBR

    ((-283, -85), (-36, 81))
    

ในประโยคสุดท้ายของจุดที่ 4 ทำไมคุณเขียน "จาก -283 ถึง -36" ทำไมไม่ 77 ถึง -36
letmaik

1
@neo เพราะ "77 ถึง -36" เป็นช่วงเวลาที่ว่าง (ตามคำนิยามช่วงเวลา [a, b] ประกอบด้วยตัวเลขทั้งหมดxเช่นที่ <= x <= b ด้วย a = 77 และ b = -36 ไม่มีตัวเลขดังกล่าว) หนึ่งอาจตอบสนองด้วยการพูดว่า "ดี เท่าที่ลองจิจูดไป 77 ถึง -36 ชัดเจนที่สุด " ปัญหาคือมันไม่ใช่: มันจะเปลี่ยนจาก 77 เป็น 180 = -180 และทำต่อไปจนถึง -36 หรือจะลดลงจาก 77 เป็น -36? เพื่อหลีกเลี่ยงความคลุมเครือดังกล่าวฉันเลือกที่จะระมัดระวัง
whuber

ฉันใช้คำตอบของคุณอย่างรวดเร็ว (ดูส่วนสำคัญ ) สำหรับการตรวจสอบว่ากล่องมีช่วงเวลาหรือไม่ฉันต้องแกะกล่องลองจิจูดที่มีขนาดยาวมิฉะนั้นจะไม่สามารถใช้งานได้กับกล่องที่ข้ามความไม่ต่อเนื่อง การเป็นมือใหม่สิ่งนี้ไม่ชัดเจนเลยสำหรับฉัน :)
letmaik
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.