กำลังคำนวณพิกัดของจตุรัส x ไมล์จากจุดศูนย์กลางหรือไม่


11

ฉันพยายามที่จะสร้างขวานไมล์สแควร์ (หรือวงกลม) รอบจุดศูนย์กลางที่ทุกด้านของสแควร์จะ x ไมล์จากศูนย์กลาง ฉันต้องการพิกัดมุมทั้งสี่

สมองของฉันกำลังดิ้นรนเพื่อให้ได้หัว ฉันสามารถคำนวณระยะห่างระหว่างจุดสองจุดโดยใช้สูตรแฮเวอรีนได้ แต่คณิตศาสตร์ไม่ได้เป็นจุดแข็งของฉันอย่างจริงจังและฉันไม่เข้าใจบาป cos ฯลฯ และการพยายามเรียงลำดับสิ่งนี้ทำให้ฉันสูญเสีย!

ฉันเจอการคำนวณละติจูด / ลองจิจูดระยะทาง X จากจุดหรือไม่ แต่ฉันไม่เข้าใจ!

ใครบ้างจะใจดีพอที่จะอธิบายว่าฉันทำสิ่งนี้ในแง่แอปเปิ้ลและลูกแพร์?

เพื่ออธิบายสิ่งที่ฉันพยายามทำ

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

ฉันต้องการค้นหา lat latmin / max และ long ของรัศมี 10mile เพื่อที่ฉันสามารถสืบค้นฐานข้อมูลของฉันโดยใช้ clause ที่คล้ายกับ:

Where buildingLat <= maxLat 
  and buildingLat <= minLat 
  and buildingLong >= minLong 
   or buildingLong >= maxLong

ฉันต้องการสูตรบางอย่าง!

พิกัดของฉันอยู่ในรูปทศนิยม

คำตอบ:


10

สำหรับจุดประสงค์นี้การประมาณแบบง่าย ๆ นั้นดีเกินพอ เหนือหรือใต้หนึ่งองศาประมาณ 69 ไมล์ แต่ตะวันออกหรือตะวันตกเพียง 69 * cos (ละติจูด) ไมล์ เนื่องจากละติจูดไม่เปลี่ยนแปลงมากเกินกว่าสิบไมล์คุณสามารถใช้โคไซน์ของละติจูดกลางของ "สแควร์" ได้อย่างปลอดภัย ดังนั้นพิกัดที่ต้องการสำหรับจุดยอดสี่เหลี่ยมจัตุรัสที่ระยะทางrไมล์จากตำแหน่งศูนย์กลาง (f, l) ที่ให้เป็น lat-lon ถูกคำนวณเป็น

df = r/69        // North-south distance in degrees
dl = df / cos(f) // East-west distance in degrees
{(f-df,l-dl), (f+df,l-dl), (f+df,l+dl), (f-df,l+dl)} // List of vertices

ตัวอย่างเช่นสมมติว่า r = 10 ไมล์และตำแหน่งกลางอยู่ที่ละติจูด 50 องศาเหนือลองจิจูด 1 องศาตะวันตกดังนั้น (f, l) = (50, -1) องศา แล้วก็

df = 10/69 = 0.145
dl = 0.145 / cos(50 degrees) = 0.145 / 0.6428 = 0.225
f - df = 50 - 0.145 = 49.855 (southernmost latitude)
f + df = 50 + 0.145 = 50.145 (northernmost latitude)
l - dl = -1 - 0.225 = -1.225 (western longitude)
l + dl = -1 + 0.225 = -0.775 (eastern longitude)

และพิกัดคือ (49.855, -1.225), (50.145, -1.225), (50.145, -0.775) และ (49.855, -0.775) เมื่อคุณเดินตามเข็มนาฬิการอบจัตุรัสเริ่มต้นที่มุมตะวันตกเฉียงใต้

อย่าใช้การประมาณนี้ใกล้กับเสาหรือสำหรับสี่เหลี่ยมที่มีขนาดใหญ่กว่าสองสามองศาที่ด้านข้าง นอกจากนี้ขึ้นอยู่กับข้อ จำกัด ของ GIS อาจจำเป็นต้องใช้ความระมัดระวังรอบการตัดทั่วโลกในลองจิจูดโดยปกติจะอยู่ที่ + -180 องศา


4

ใช้พิกัด X ของกึ่งกลางแล้วลบ x ไมล์จากนี้นี่คือด้านซ้ายของสี่เหลี่ยมจัตุรัสของคุณ จากนั้นใช้พิกัด Y ของศูนย์กลางแล้วลบ X ไมล์จากนี้นี่คือด้านล่างของสี่เหลี่ยมจัตุรัสของคุณ ทำซ้ำขั้นตอนเหล่านี้ แต่เพิ่มแทนการลบเพื่อให้ได้ขอบขวาและขอบด้านบนสุด ตอนนี้คุณสามารถสร้างมุมทั้งสี่ของจัตุรัสได้แล้ว

หมายเหตุข้างต้นสมมติว่าจุดศูนย์กลางของคุณอยู่ในหน่วยไมล์ หากไม่ได้เป็นครั้งแรกที่มันปฏิเสธ การเดิมพันอื่น ๆ ที่ชาญฉลาดจะถูกปิดและสแควร์ของคุณจะไม่เป็นสแควร์


คุณหมายถึงหน้าตัวอย่างหรือไม่ ฉันจะลบไมล์ออกจากพิกัดได้อย่างไรและฉันไม่จำเป็นต้องคำนึงถึงความโค้งของโลกอย่างไร
Bex

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

ตอนนี้ฉันสับสนจริงๆ! ฉันได้อัปเดตคำถามของฉันเพื่อพูดสิ่งที่ฉันพยายามจะทำ ฉันต้องการสร้างกล่อง จำกัด เพื่อให้ฉันสามารถค้นหาขั้นต่ำและสูงสุดและยาว
Bex

3
proj4js ( proj4js.org ) น่าจะช่วยได้แล้ว
Ian Turton

1
พิกัดของฉันมีลักษณะเช่นนี้: 51.498485, -0.129089 นั่นคือองศาไม่ใช่หรือ?
Bex

4

ในที่สุดคำตอบของฉันคือ: (ใน c #)

ฉันอาจไม่ต้องการพิกัด 4 ตัว แต่ฉันคิดว่ามันแม่นยำพอสมควร

 public static void GetBoundingCoords(double centerLat, double centerLong,  double distance)
    {
     Coordinate top=   MaxLatLongOnBearing(centerLat, centerLong,45,10);
     Coordinate right = MaxLatLongOnBearing(centerLat, centerLong, 135, 10);
     Coordinate bottom = MaxLatLongOnBearing(centerLat, centerLong, 225, 10);
     Coordinate left = MaxLatLongOnBearing(centerLat, centerLong, 315, 10);
    }

    public static Coordinate MaxLatLongOnBearing(double centerLat, double centerLong, double bearing, double distance)
    {

        var lonRads = ToRadian(centerLong);
        var latRads = ToRadian(centerLat);
        var bearingRads = ToRadian(bearing);
        var maxLatRads = Math.Asin(Math.Sin(latRads) * Math.Cos(distance / 6371) + Math.Cos(latRads) * Math.Sin(distance / 6371) * Math.Cos(bearingRads));
        var maxLonRads = lonRads + Math.Atan2((Math.Sin(bearingRads) * Math.Sin(distance / 6371) * Math.Cos(latRads)), (Math.Cos(distance / 6371) - Math.Sin(latRads) * Math.Sin(maxLatRads)));

        var maxLat = RadiansToDegrees(maxLatRads);
        var maxLong = RadiansToDegrees(maxLonRads);

        return new Coordinate(){Latitude=maxLat, Longitude=maxLong};
    }

แก้ไข

เมื่อฉันเพิ่งรู้ว่าฉันตั้งมุมของสี่เหลี่ยมจัตุรัส x ไมล์ของฉันจากจุดกึ่งกลางขอบของสี่เหลี่ยมจัตุรัสของฉันจะไม่เป็นไมล์ x เดียวกัน (คณิตศาสตร์บอกว่าไม่ใช่จุดแข็งของฉัน) ดังนั้นเพื่อให้ได้มุมของระยะห่างจากจุดศูนย์กลางถ้าฉันต้องการให้กำลังสองของสี่เหลี่ยมจัตุรัส x ไมล์ฉันใช้ทฤษฎีบทของพีทาโกรัสในการหาระยะห่างของเส้นทแยงมุม (บนสามเหลี่ยมมุมฉากสี่เหลี่ยมจัตุรัสบนด้านตรงข้ามมุมฉาก (เส้นทแยงมุม) เท่ากับเขากำลังสองของอีกสองด้าน)


นั่นจะไม่ใช่รูปสี่เหลี่ยมจัตุรัส
Ian Turton

ฉันได้แก้ไขตลับลูกปืนของฉันมันเป็นเพชร .. ตอนนี้เป็นสี่เหลี่ยม
ซ์

เกี่ยวกับการแก้ไขทฤษฎีบทพีทาโกรัสก็ใช้ได้กับสี่เหลี่ยมเล็ก ๆ แต่โดยทั่วไปแล้วมันไม่ได้เป็นรูปสามเหลี่ยมมุมฉากทรงกลม เป็นเรื่องแปลกที่รหัสของคุณใช้ตรีโกณมิติทรงกลมร่วมกับการประมาณนี้ตามเรขาคณิตของระนาบ
whuber

ระยะทางของฉันจะไม่เกิน 100 ไมล์ดังนั้นฉันไม่คิดว่ามันสำคัญ เนื่องจากความไม่ถูกต้องจะมีขนาดเล็กด้วยระยะทางที่เล็กลง
Bex

1
ฉันคิดว่าประเด็นที่ @whuber กำลังทำอยู่ก็คือมันไม่มีประโยชน์ที่จะใช้การคำนวณระยะทางที่ซับซ้อนตาม Lat และ Long เนื่องจากคุณรวมมันกับทฤษฎีบทพีทาโกรัส คุณสามารถใช้การคำนวณที่ง่ายกว่าแทนเช่นที่คนทำหรืออย่างที่Ewan Toddทำ ใช้สูตรเชิงเส้นอย่างง่ายเพื่อแปลงลองจิจูดเป็นไมล์และละติจูดเป็นไมล์หรือในทางกลับกัน ส่วน "ยุ่งยาก" เพียงอย่างเดียวคือการรู้ว่าสูตรลองจิจูดต้องการการปรับเปลี่ยน* cos(lat)เมื่อแปลงองศาเป็นไมล์และ/ cos(lat)เมื่อแปลงไมล์เป็นองศา
ToolmakerSteve

0

หากคุณใช้ฐานข้อมูลที่รู้จักเชิงพื้นที่คุณสามารถแปลงพื้นที่ที่คุณสนใจเป็นระบบพิกัดเดียวกันกับที่ข้อมูลของคุณถูกเก็บไว้ในแอปเปิ้ลเพื่อทำการเปรียบเทียบ

ตัวอย่างเช่น:

  1. ผู้ใช้เลือกสถานที่ส่งผลให้ lat / lon
  2. ขอให้ฐานข้อมูลเชิงพื้นที่แปลงจุดนี้ให้เป็นระบบพิกัดที่เหมาะสมกับพื้นที่ (หน่วยฟุตหรือเมตร ฯลฯ )
  3. สร้างพื้นที่ที่คุณสนใจรอบ ๆ จุดที่คาดการณ์ไว้
  4. ขอให้ฐานข้อมูลเชิงพื้นที่แปลงพื้นที่ที่น่าสนใจนี้กลับเป็น lat / lon
  5. เปรียบเทียบสิ่งที่คุณต้องทำ

0

ฉันใช้สิ่งที่อยู่ในหน้านี้

จุดปลายทางกำหนดระยะทางและทิศทางจากจุดเริ่มต้น

สูตร:
lat2 = asin (sin (lat1) * cos (d / R) + cos (lat1) * sin (d / R) * cos (θ))
lon2 = lon1 + atan2 (sin (θ) * sin (d / R) * cos (lat1), cos (d / R) −sin (lat1) * sin (lat2)

bearing คือตลับลูกปืน (เป็นเรเดียนตามเข็มนาฬิกาจากทิศเหนือ); d / R คือระยะเชิงมุม (เป็นเรเดียน) โดยที่ d คือระยะทางที่เดินทางและ R คือรัศมีของโลก

สำหรับθฉันใช้ -45 องศา (เป็นเรเดียน) สำหรับ "จุดบนซ้าย" และ 135 องศาสำหรับ "ล่างขวา"

(ฉันเพิ่งถามคำถามเดียวกันในเว็บไซต์คณิตศาสตร์ )


ปัญหาของการแก้ปัญหานี้คือคุณต้องหาระยะทางสำหรับเส้นทแยงมุมของสแควร์ก่อน มันง่ายกว่าแทนที่จะเคลื่อนที่ไปตามภูมิศาสตร์ศาสตร์จากกึ่งกลางไปจนถึงจุดกึ่งกลางของด้านข้างจากนั้นหมุน 90 องศาเพื่อเลื่อนไปตามด้านของจัตุรัส
whuber

@ โฮเบอร์, ถ้าระยะทางมีขนาดเล็กพอ, คุณไม่สามารถใช้ตรีโกณมิติอย่างง่ายสำหรับมันได้หรือไม่? (d = ฝั่งตรงข้าม / บาป (ด้านประชิด) ฉันทำเช่นนั้นเพราะฉันไม่ต้องการระยะทางที่แน่นอนมิฉะนั้นคุณสามารถใช้สูตรนี้สองครั้งเพื่อทำสิ่งที่คุณพูด (ก่อนด้วยθ = 0 ด้วยθ = -90 สำหรับมุมซ้ายบน)
juan

ถูกต้องแล้วฮวน แต่มีใครสงสัยว่าทำไมคุณถึงใช้สูตรที่ซับซ้อนกว่าของรูปทรงกลมเมื่อคุณเริ่มต้นด้วยการประมาณที่สมมติว่าสูตรแบบยุคลิดจะใช้งานได้ตั้งแต่แรก ไม่มีอะไรผิดปกติกับการใช้สูตรทรงกลม แต่ไม่จำเป็นและไม่มีประสิทธิภาพในการคำนวณ
whuber

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