Menghitung koordinat persegi x mil dari titik pusat?

11

Saya mencoba membuat persegi kapak mil (atau lingkaran) di sekitar titik pusat, di mana semua sisi alun-alun akan menjadi x mil dari pusat. Saya perlu koordinat 4 sudut.

Apakah otakku sedang berusaha menggerakkan kepalaku? Saya dapat menghitung jarak antara dua titik menggunakan rumus haversine tetapi matematika secara serius bukan titik kuat saya dan saya tidak mengerti dosa, cos dll. Dan mencoba menyelesaikan masalah ini telah kehilangan saya!

Saya telah menemukan Menghitung Lintang / Bujur X mil dari titik? tapi saya tidak mengerti!

Adakah yang cukup baik untuk menjelaskan bagaimana saya melakukan ini dalam bentuk apel dan pir?

Untuk menjelaskan dengan tepat apa yang saya coba lakukan;

Saya memiliki situs web, di mana pengguna dapat mencari bangunan di area tertentu. Mereka akan memasuki sebuah kota atau tempat (yang akan saya ketahui paling jauh) dan mereka mencari dalam radius tertentu katakanlah 10 mil dari tempat itu.

Saya perlu menemukan min / maks lat dan panjang dari jari-jari 10mile sehingga saya dapat meminta database saya menggunakan klausa mana yang mirip dengan:

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

Saya perlu semacam formula!

Koordinat saya dalam derajat desimal

Bex
sumber

Jawaban:

10

Untuk tujuan ini, perkiraan sederhana lebih dari cukup. Utara atau selatan, satu derajat sekitar 69 mil tetapi timur atau barat, hanya 69 * cos (garis lintang) mil. Karena garis lintang tidak berubah banyak dalam rentang sepuluh mil, Anda dapat menggunakan cosinus garis lintang tengah "kotak" dengan aman. Oleh karena itu koordinat yang diinginkan untuk simpul kuadrat pada jarak r mil dari lokasi pusat (f, l), diberikan sebagai lat-lon, dihitung sebagai

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

Sebagai contoh, misalkan r = 10 mil dan lokasi pusat berada di lintang 50 derajat utara, bujur 1 derajat barat, sehingga (f, l) = (50, -1) derajat. Kemudian

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)

dan koordinatnya adalah (49.855, -1.225), (50.145, -1.225), (50.145, -0.775), dan (49.855, -0.775) saat Anda berbaris searah jarum jam di sekitar alun-alun mulai dari sudut barat daya.

Jangan gunakan perkiraan ini di dekat kutub atau untuk kotak yang lebih besar dari beberapa derajat di satu sisi. Juga, tergantung pada batasan GIS, beberapa kehati-hatian mungkin diperlukan di sekitar pemangkasan global dalam garis bujur, biasanya diambil pada + -180 derajat.

whuber
sumber
4

Ambil koordinat X dari pusat dan kurangi x mil dari itu, ini adalah sisi kiri bujur sangkar Anda. Kemudian ambil koordinat Y dari pusat dan kurangi X miles dari itu, ini adalah bagian bawah bujur sangkar Anda. Ulangi langkah-langkah ini tetapi tambahkan bukannya mengurangi untuk mendapatkan tangan kanan dan tepi atas. Anda sekarang dapat membangun empat sudut persegi Anda.

Perhatikan di atas mengasumsikan bahwa titik pusat Anda berada dalam mil. Jika tidak memproyeksi ulang itu pertama. Selain itu, semua taruhan dibatalkan dan kuadrat Anda tidak akan kuadrat.

Ian Turton
sumber
Apakah Anda merujuk ke halaman contoh? Bagaimana cara mengurangi mil dari koordinat dan tidak perlu memperhitungkan kelengkungan bumi?
Bex
Tidak, ini sangat sederhana sehingga tidak perlu memiliki contoh yang berfungsi. Mungkin Anda perlu menentukan perangkat lunak apa yang Anda gunakan? Seperti yang saya katakan solusi saya berasumsi Anda telah memproyeksikan koordinat Anda ke SRS lokal (jika Anda belum maka itu harus menjadi pertanyaan pertama Anda)
Ian Turton
Saya benar-benar bingung sekarang! Saya telah memperbarui pertanyaan saya untuk mengatakan dengan tepat apa yang saya coba lakukan. Saya agak perlu membuat kotak pembatas sehingga saya dapat menemukan min dan max lat dan panjang.
Bex
3
proj4js ( proj4js.org ) semestinya membantu
Ian Turton
1
Koordinat saya terlihat seperti ini: 51.498485, -0.129089 itu adalah derajat bukan?
Bex
4

Akhirnya jawaban saya adalah: (dalam c #)

Saya mungkin tidak memerlukan 4 koordinat tetapi saya pikir mereka cukup akurat.

 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};
    }

EDIT

Baru saja menyadari jika saya mengatur sudut persegi saya x mil dari titik pusat, tepi persegi saya tidak akan sama dengan x mil. (Kata matematika bukan titik kuat saya) Jadi untuk mendapatkan titik sudut jarak dari titik pusat jika saya ingin tepi kuadrat saya ke x mil saya menggunakan Teorema Pythagoras untuk menghitung jarak diagonal. (pada segitiga siku-siku, kuadrat pada sisi miring (diagonal) sama dengan kuadrat dari dua sisi lainnya)

Bex
sumber
itu tidak akan menjadi persegi.
Ian Turton
Saya telah mengubah bantalan saya, itu adalah berlian .. sekarang persegi
Bex
Mengenai pengeditan, Teorema Pythagoras ok untuk kotak kecil, tetapi secara umum tidak berlaku untuk segitiga siku-siku yang benar. Aneh, kemudian, bahwa kode Anda menggunakan trigonometri bola bersama-sama dengan pendekatan ini berdasarkan geometri bidang.
whuber
Jarak saya tidak akan pernah lebih dari 100 mil jadi saya pikir itu tidak penting. Karena ketidakakuratan akan kecil dengan jarak yang lebih kecil.
Bex
1
Saya pikir titik @whuber membuat adalah bahwa tidak ada manfaatnya menggunakan perhitungan kompleks jarak sepanjang Lat dan Long, mengingat bahwa Anda kemudian menggabungkan mereka dengan teorema pythagoras. Anda bisa menggunakan perhitungan yang jauh lebih sederhana, seperti yang dilakukan whuber, atau seperti yang dilakukan Ewan Todd . Gunakan rumus linear sederhana untuk mengubah garis bujur menjadi mil dan garis lintang ke mil, atau sebaliknya. Satu-satunya bagian "rumit" adalah mengetahui bahwa rumus bujur membutuhkan penyesuaian * cos(lat)ketika mengkonversi derajat ke mil, dan / cos(lat)ketika mengkonversi mil ke derajat.
ToolmakerSteve
0

Jika Anda menggunakan basis data yang sadar spasi, Anda dapat mengubah bidang yang Anda minati menjadi sistem koordinat yang sama dengan tempat data Anda disimpan dan kemudian melakukan perbandingan apel dengan apel.

Sebagai contoh:

  1. Pengguna memilih lokasi, menghasilkan lat / lon.
  2. Minta basis data spasial untuk mengubah titik ini menjadi sistem koordinat yang diproyeksikan yang sesuai dengan area tersebut (satuan kaki atau meter, dll.).
  3. Bangun bidang minat Anda di sekitar titik yang diproyeksikan.
  4. Minta basis data spasial untuk mengonversi bidang minat ini kembali ke lat / lon.
  5. Lakukan perbandingan apa pun yang perlu Anda lakukan.
Gagak
sumber
0

Saya menggunakan apa yang ada di halaman ini

Titik tujuan diberi jarak dan arah dari titik awal

Rumus:
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))

θ adalah bantalan (dalam radian, searah jarum jam dari utara); d / R adalah jarak sudut (dalam radian), di mana d adalah jarak yang ditempuh dan R adalah jari-jari bumi

Untuk θ saya menggunakan -45 derajat (dalam radian) untuk "titik kiri atas" dan 135 derajat untuk "kanan bawah"

(Baru-baru ini saya mengajukan pertanyaan yang sama di situs matematika )

juan
sumber
Masalah dengan solusi ini adalah pertama-tama Anda harus mencari tahu jarak untuk diagonal persegi. Alih-alih lebih mudah untuk bergerak di sepanjang geodesik dari pusat ke titik tengah sisi dan kemudian, berputar 90 derajat, untuk bergerak di sepanjang sisi alun-alun.
whuber
@whuber, Jika jaraknya cukup kecil, tidak bisakah kamu menggunakan trigonometri sederhana untuk itu? (d = sisi yang berlawanan / dosa (sisi yang berdampingan). Saya melakukan itu karena saya tidak perlu jarak yang tepat. Jika tidak, Anda dapat menerapkan rumus ini dua kali untuk melakukan apa yang Anda katakan (pertama dengan θ = 0 lalu dengan θ = -90 untuk kiri atas misalnya)
juan
Itu benar, Juan. Tetapi orang bertanya-tanya mengapa Anda menggunakan rumus geometri bola yang lebih rumit ketika Anda memulai dengan perkiraan yang mengandaikan rumus Euclidean akan bekerja di tempat pertama. Tidak ada yang salah dengan menggunakan rumus bola, tapi itu tidak perlu dan tidak efisien secara komputasi.
whuber
@whuber, untuk kasus kedua ini bukan perkiraan (menerapkan rumus dua kali untuk setiap sisi). Anda benar bahwa tidak masuk akal untuk mencampurkannya. Saya sebenarnya sudah menerapkan ini, tapi saya akan mengubahnya (oh, dan alasannya adalah karena saya tidak pandai matematika :))
juan