PHP Вычисление площади между координатами не выполняется для неквадратных прямоугольников в WGS84 CRSPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 PHP Вычисление площади между координатами не выполняется для неквадратных прямоугольников в WGS84 CRS

Сообщение Anonymous »

У меня есть функция PHP, предназначенная для вычисления площади между двумя координатами с использованием системы координат WGS84 (CRS). Функция работает корректно, когда прямоугольник, образованный координатами, ближе к квадрату, но не дает точных результатов, когда прямоугольник вытянут как по горизонтали, так и по вертикали.
Вот функция в ее текущее состояние:

Код: Выделить всё

    /**
* Calculate the area between two coordinates in WGS84 CRS.
* @param float $latitude1 - Latitude of the upper-left coordinate.
* @param float $longitude1 - Longitude of the upper-left coordinate.
* @param float $latitude2 - Latitude of the lower-right coordinate.
* @param float $longitude2 - Longitude of the lower-right coordinate.
* @return float - Area in square meters between the specified coordinates.
*/
public static function calculateArea(float $latitude1, float $longitude1, float $latitude2, float $longitude2): float
{
//Funciona toda la función --> NO TOCAR
$geographicCRS = Geographic3D::fromSRID(Geographic3D::EPSG_WGS_84); // WGS 84
$topLeft = GeographicPoint::create($geographicCRS, new Degree($latitude1), new Degree($longitude1), new Metre(0), null); //new Length(0)
$bottomLeft = GeographicPoint::create($geographicCRS, new Degree($latitude2), new Degree($longitude1),  new Metre(0), null);
$topRight = GeographicPoint::create($geographicCRS, new Degree($latitude1), new Degree($longitude2),  new Metre(0), null);

// Calcular la distancia horizontal (en metros)
$distanceX = $topLeft->calculateDistance($topRight);

// Calcular la distancia vertical (en metros)
$distanceY = $topLeft->calculateDistance($bottomLeft);

$distanceXKm = $distanceX->asMetres()->getValue() / 1000; // Convertir de metros a kilómetros
$distanceYKm = $distanceY->asMetres()->getValue() / 1000; // Convertir de metros a kilómetros

// Área = distanceXKm * distanceYKm
$area = $distanceXKm * $distanceYKm;

return $area;
}
Я тоже стараюсь:

Код: Выделить всё

public static function calculateArea(float $latitude1, float $longitude1, float $latitude2, float $longitude2): float
{
// Earth's radius in kilometers
$earthRadiusKm = 6371.0;

// Convert degrees to radians
$lat1Rad = deg2rad($latitude1);
$lat2Rad = deg2rad($latitude2);
$lon1Rad = deg2rad($longitude1);
$lon2Rad = deg2rad($longitude2);

// Calculate distances in Mercator projection
$distanceX = $earthRadiusKm * abs($lon2Rad - $lon1Rad) * cos(($lat1Rad + $lat2Rad) / 2);
$distanceY = $earthRadiusKm * abs($lat2Rad - $lat1Rad);

// Calculate area in square kilometers
$areaSquareKm = $distanceX * $distanceY;

return $areaSquareKm;
}
Описание проблемы:
  • Функция точно вычисляет площадь, когда прямоугольник, образованный координаты близки к квадрату.
  • Однако это дает неточные результаты, если прямоугольник вытянут по горизонтали или вертикали.
Дополнительная информация:
Я использую следующие библиотеки в своем классе PHP для манипулирования и преобразования координат:

Код: Выделить всё

// Area calculation
use PHPCoord\CoordinateReferenceSystem\Geographic2D;
use PHPCoord\Geometry\LinearRing;
use PHPCoord\Geometry\Polygon;
use PHPCoord\Geometry\Position;
use PHPCoord\Point\GeographicPoint;
use PHPCoord\UnitOfMeasure\Angle\Degree;
use PHPCoord\UnitOfMeasure\Length\Metre;

// Coordinate conversion
use proj4php\Proj4php;
use proj4php\Proj;
use proj4php\Point;
Проблема с существующими решениями:
Я исследовал различные решения проблемы переполнения стека, в том числе использование функции abs для расчета размеров, но ни одно из них не дало точных результатов. результатов, особенно для неквадратных прямоугольников.
Запрос:
Я ищу решение или альтернативный подход для точного вычислите площадь между координатами в неквадратном прямоугольнике, используя WGS84 CRS. В идеале решение должно учитывать кривизну Земли и обеспечивать точные результаты независимо от соотношения сторон прямоугольника.
Будем очень признательны за любые идеи и предложения. Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/786 ... ngles-in-w
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»