Создать координатную сетку с учетом количества строк, столбцов и начальной точки - PullRequest
0 голосов
/ 04 октября 2018

Мне нужна помощь с экстраполяцией пары широта / долгота в квадратную сетку.Сетка 200х200 ячеек.Каждая ячейка 1NM * 1NM.Начальная пара широта / долгота - это юго-западный угол сетки.

Например, столбец 0 и строка 0 должны быть первыми четырьмя парами координат, чтобы сделать первую ячейку сетки размером 1NM * 1NM.Столбец 0, строка 1, должны быть следующими четырьмя парами координат, чтобы следующая ячейка сетки была выше первой.После 200 строк перейдите к следующему столбцу и т. Д.

Я попытался сделать это, используя следующий код PHP, но не могу правильно экстраполировать данные.

<?php
header('Content-Type:text/plain');

// southwest coordinate pair (starting point)
$lat = 38.883672;
$lon = -105.698848;

for($col = 0; $col < 200; $col++) {
  $startLat = $startLat2 = 0;
  $startLon = $startLon2 = 0;

  if($col > 0) {
    $lat = Extrapolate($lat, $lon, 1.0, 90)[0];
    $lon = Extrapolate($lat, $lon, 1.0, 90)[1];
  }

  $debug = sprintf("%s,%s\r\n", $lat, $lon);

  for($row = 0; $row < 200; $row++) {
    if($row == 0) {
      $startLat = Extrapolate($lat, $lon, 1.0, 360)[0];
      $startLon = Extrapolate($lat, $lon, 1.0, 360)[1];

      $startLat2 = Extrapolate($lat, $lon, 1.0, 90)[0];
      $startLon2 = Extrapolate($lat, $lon, 1.0, 90)[1];

      $nextLat = $startLat;
      $nextLon = $startLon;

      $nextLat2 = $startLat2;
      $nextLon2 = $startLon2;

      $debug .= sprintf("%s,%s\r\n", $startLat, $startLon);
      $debug .= sprintf("%s,%s\r\n", $startLat2, $startLon2);
    }
    else {
      $nextLat = Extrapolate($nextLat, $nextLon, 1.0, 360)[0];
      $nextLon = Extrapolate($nextLat, $nextLon, 1.0, 360)[1];

      $nextLat2 = Extrapolate($nextLat2, $nextLon2, 1.0, 90)[0];
      $nextLon2 = Extrapolate($nextLat2, $nextLon2, 1.0, 90)[1];

      $debug .= sprintf("%s,%s\r\n", $nextLat, $nextLon);
      $debug .= sprintf("%s,%s\r\n", $nextLat2, $nextLon2);
    }
  }

  echo $debug;
}

function Extrapolate($lat1,$long1,$d,$angle)
{
  # Earth Radious in KM
  $R = 6378.14;

  # Degree to Radian
  $latitude1 = $lat1 * (M_PI/180);
  $longitude1 = $long1 * (M_PI/180);
  $brng = $angle * (M_PI/180);

  # Distance to NM
  $d *= 1.85200;

  $latitude2 = asin(sin($latitude1)*cos($d/$R) + cos($latitude1)*sin($d/$R)*cos($brng));
  $longitude2 = $longitude1 + atan2(sin($brng)*sin($d/$R)*cos($latitude1),cos($d/$R)-sin($latitude1)*sin($latitude2));

  # back to degrees
  $latitude2 = $latitude2 * (180/M_PI);
  $longitude2 = $longitude2 * (180/M_PI);

  $lat2 = round ($latitude2,6);
  $long2 = round ($longitude2,6);

  // Push in array and get back
  $coords[0] = $lat2;
  $coords[1] = $long2;
  return $coords;
 }

1 Ответ

0 голосов
/ 05 октября 2018

Существует быстрый способ решить эту проблему, признав, что 1NM «равен» 1/60 градуса.Я говорю «равно», потому что это старое определение, которое не выдержало очень точных современных измерений, но, тем не менее, все еще полезно.

Координаты увеличиваются при перемещении N и E. Это означает перемещение на 1 нм на восток или на 1 нм.Север (соответствует вашей сетке 1NM), вам нужно только добавить 1/60 градуса к соответствующей координате.

Например, если вы начинаете с

// юго-западная пара координат (начальная точка)

$lat = 38.883672;
$lon = -105.698848;

Перемещение на 1NM на север (1 квадрат сетки)

$lat[1] = 38.883672 + .016667; // 38.900339

Перемещение на 1NM восток (1 квадрат сетки)

$lon[1] = -105.698848 + .016667; // -105.682181

Таким образом, вы можете легко построить сетку 200x200, просто увеличив ее.

Верхний правый угол сетки будет иметь координаты:

Переместить 200NM на север (200 квадратов сетки)

$lat[1] = 38.883672 + .016667*200; // 42.217072

Переместить 200NM на восток (квадрат 200 сеток)

$lon[1] = -105.698848 + .016667*200; // -102.365448

Также, если вы хотите построить сетку,лучше всего хранить его в двумерном массиве, как показано ниже:

<?php
//header('Content-Type:text/plain');

// southwest coordinate pair (starting point)
$lat = 38.883672;
$lon = -105.698848;

for ($col=0; $col< 200; $col++){
    echo PHP_EOL."Grid values for col ".$col.PHP_EOL;
    for ($row=0; $row< 200; $row++){
      $newCoords = extrapolate($lat,$lon,$row,$col);
      $coords[$col][$row]["lat"] = $newCoords["lat"];
      $coords[$col][$row]["lon"] = $newCoords["lon"];
      echo "Row ".$row." = ".$coords[$col][$row]["lat"]." , ";
      echo $coords[$col][$row]["lon"].PHP_EOL;
    }
}

function extrapolate($lat,$lon,$row,$col){
  $newCoords["lat"] = round($lat + (1/60)*$row,6);
  $newCoords["lon"] = round($lon + (1/60)*$col,6);
  return ($newCoords);
}

Теперь, если вы предпочитаете использовать свой собственный метод для вычисления смещений, вы можете просто изменить функцию extrapolate().

РЕДАКТИРОВАТЬ: Добавить это по запросу.

Как только у вас есть массив выше, вы можете выбрать координаты, окружающие каждую ячейку, следующим образом.К примеру будет выбрана нижняя SW-ячейка.Его 4 пары координат:

// угол SW

$coords[0][0]["lat"];
$coords[0][0]["lon"];

// угол NW

$coords[0][1]["lat"];
$coords[0][1]["lon"];

// угол SE

$coords[1][0]["lat"];
$coords[1][0]["lon"];

// NE corner

$coords[1][1]["lat"];
$coords[1][1]["lon"];

В другом примере выберем верхнюю ячейку NE.Его 4 пары координат:

// угол SW

$coords[198][198]["lat"];
$coords[198][198]["lon"];

// угол NW

$coords[198][199]["lat"];
$coords[198][199]["lon"];

// угол SE

$coords[199][198]["lat"];
$coords[199][198]["lon"];

// NE corner

$coords[199][199]["lat"];
$coords[199][199]["lon"];

Помогает ли это?

...