Вот функция в ее текущее состояние:
Код: Выделить всё
/**
* 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
Мобильная версия