Вот функция в ее текущее состояние:
Код: Выделить всё
/**
* 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
{
// Entire function works as intended --> DO NOT MODIFY
$geographicCRS = Geographic2D::fromSRID(Geographic2D::EPSG_WGS_84); // WGS 84
$topLeft = GeographicPoint::create($geographicCRS, new Degree($latitude1), new Degree($longitude1), null, null);
$bottomLeft = GeographicPoint::create($geographicCRS, new Degree($latitude2), new Degree($longitude1), null, null);
$topRight = GeographicPoint::create($geographicCRS, new Degree($latitude1), new Degree($longitude2), null, null);
// Calculate horizontal distance (in meters)
$distanceX = $topLeft->calculateDistance($topRight);
// Calculate vertical distance (in meters)
$distanceY = $topLeft->calculateDistance($bottomLeft);
$distanceXKm = $distanceX->asMetres()->getValue() / 1000; // Convert from meters to kilometers
$distanceYKm = $distanceY->asMetres()->getValue() / 1000; // Convert from meters to kilometers
// Area = distanceXKm * distanceYKm
$area = $distanceXKm * $distanceYKm;
return $area;
}
- Функция точно вычисляет площадь, когда прямоугольник, образованный координаты близки к квадрату.
- Однако это дает неточные результаты, если прямоугольник вытянут по горизонтали или вертикали.
Я использую следующие библиотеки в своем классе 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
Мобильная версия