Обчислення координат квадратних миль від центральної точки?


11

Я намагаюся створити квадрат (або коло) сокири навколо центральної точки, де всі сторони площі були б на відстані х миль від центру. Мені потрібні 4 кутові координати.

Це морочить мій мозок, намагаючись обвести його головою? Я можу розробити відстань між двома пунктами за допомогою формули Гаверсина, але математика серйозно не є моїм сильним моментом, і я не розумію гріх, cos і т. Д. І намагаючись розібратися в цьому, втратила мене!

Я зіткнувся з обчисленням Широта / Довгота X миль від точки? але я просто не розумію!

Хтось міг би пояснити, як я це роблю в термінах яблук та груш?

Пояснити точно, що я намагаюся зробити;

У мене є веб-сайт, де користувачі можуть шукати будівлі в певній місцевості. Вони в’їдуть до міста чи місця (про яке я буду знати довгий час) і шукатимуть у певному радіусі, наприклад, 10 миль від місця.

Мені потрібно знайти мінімальний / максимальний лат і довжини радіуса 10 миль, щоб я міг запитати свою базу даних, використовуючи пункт, подібний до:

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), коли ви рухаєтесь за годинниковою стрілкою навколо площі, починаючи з її південно-західного кута.

Не використовуйте це наближення біля стовпів або для квадратів, більших на кілька градусів збоку. Також, залежно від обмежень ГІС, може знадобитися деяка обережність навколо глобального розрізу довготи, який зазвичай приймається при + -180 градусах.


4

Візьміть координату X від центру і відніміть від нього х миль, це ліва частина вашого квадрата. Потім візьміть координату Y від центру і відніміть від нього X миль, це нижня частина вашого квадрата. Повторіть ці кроки, але додаючи замість віднімання, щоб отримати праву руку та верхній край. Тепер ви можете побудувати чотири кути вашої площі.

Зверніть увагу, що вище припускається, що ваша центральна точка знаходиться в милях. Якщо це не спочатку, відтворіть його. Інші розумні всі ставки відключені, і ваша площа не буде площею.


Ви посилаєтесь на сторінку прикладу? Як я віднімаю милі від координати і чи не потрібно брати до уваги кривизну землі?
Бекс

Ні, це не так просто, немає фактичної необхідності мати приклад, що працює. Можливо, вам потрібно вказати, яке програмне забезпечення ви використовуєте? Як я вже сказав, моє рішення передбачає, що ви спроектували свою координату на місцеву СРС (якщо ви цього не зробили, це повинно бути вашим першим питанням)
Ян Тертон

Я зараз справді розгублений! Я оновив своє запитання, щоб сказати саме те, що намагаюся зробити. Мені потрібно створити обмежувальний ящик, щоб я міг знайти мінімальний та максимальний лат та довгий.
Бекс

3
proj4js ( proj4js.org ) повинен допомогти тоді
Ian Turton

1
Мої координати виглядають так: 51.498485, -0.129089, це градуси, чи не так?
Бекс

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

EDIT

Щойно зрозумівши, якщо я встановити кути мого квадрата x миль від центральної точки, краї мого квадрата не будуть однаковими x милями. (сказав, що математика не була моєю сильною точкою) Отже, щоб отримати відстані кутових точок від центральної точки, якщо я хочу, щоб краї моїх квадратів були до x миль, я використав теорему Піфагора, щоб опрацювати відстань діагоналі. (у прямокутному трикутнику квадрат на гіпотенузі (діагоналі) дорівнює площі двох інших сторін)


це не буде площею.
Ян Тертон

Я доповнив свої підшипники, це був алмаз. Зараз це квадрат
Бекс

Щодо редагування, теорема Піфагора нормальна для малих квадратів, але загалом це не стосується сферичних правильних трикутників. Тож дивно, що ваш код використовує сферичну тригонометрію разом з цим наближенням, заснованим на геометрії площини.
whuber

Моя відстань ніколи не буде більше 100 миль, тому я не думаю, що це має значення. Оскільки неточності будуть невеликими при тому меншому відстані.
Бекс

1
Я думаю, що суть @whuber полягає в тому, що використання корисного обчислення відстані вздовж Лат і Лонга немає користі, враховуючи, що ви потім комбінуєте їх з теоремою піфагора. Натомість ви можете використовувати набагато простіший розрахунок, як, наприклад, whuber або Еван Тодд . Використовуйте прості лінійні формули для перетворення довготи в милі і широти в милі, або навпаки. Єдина «хитра» частина - це знати, що формула довготи потребує коригування * 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))

θ - підшипник (у радіанах, за годинниковою стрілкою з півночі); d / R - кутова відстань (у радіанах), де d - пройдена відстань, а R - радіус Землі

Для θ я використовував -45 градусів (в радіанах) для "верхньої лівої точки" і 135 градусів для "нижньої правої"

(Нещодавно я задавав те саме питання на сайті з математики )


Проблема з цим рішенням полягає у тому, що спочатку ви повинні з'ясувати відстань для діагоналей квадрата. Натомість простіше рухатись геодезикою від центру до середини сторін, а потім, повертаючи на 90 градусів, рухатися по сторонах квадрата.
whuber

@whuber, Якщо відстань досить мала, чи не можеш для цього використати просту тригонометрію? (d = протилежна сторона / sin (сусідня сторона). Я роблю це, тому що мені не потрібно, щоб ця відстань була точною. Інакше ви можете застосувати цю формулу двічі, щоб зробити саме те, що ви говорите (спочатку з θ = 0, потім з θ = -90 для верхнього лівого, наприклад)
хуан

Це правильно, Хуан. Але залишається цікаво, чому ви використовуєте складніші формули сферичної геометрії, коли ви починаєте з наближення, яке передбачає, що формули Евкліда будуть працювати в першу чергу. У використанні сферичних формул немає нічого поганого, але це непотрібно та обчислювально неефективно.
whuber

@whuber, для другого випадку це не приблизно (застосовуючи формулу двічі для кожної сторони). Ти маєш рацію, що змішувати їх не було б сенсу. Я насправді це реалізував, але я його зміню (о, і причина в тому, що я не так добре в математиці :))
червень
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.