开源PHP函数,用于将UTM坐标转换为纬度和经度?
我正在制作一个涉及谷歌地图的PHP应用程序。“地图”仅接受lat&lng对,我要显示的数据仅带有UTM样式的坐标。有开源的PHP函数可以从一个转换到另一个吗 像这样的东西会很棒:开源PHP函数,用于将UTM坐标转换为纬度和经度?,php,latitude-longitude,utm,Php,Latitude Longitude,Utm,我正在制作一个涉及谷歌地图的PHP应用程序。“地图”仅接受lat&lng对,我要显示的数据仅带有UTM样式的坐标。有开源的PHP函数可以从一个转换到另一个吗 像这样的东西会很棒: $UTM_ZONE = '32'; $UTMX = '60329834,34'; $UTMY = '67382984,9'; $latlng = convert($UTM_ZONE, $UTMX, $UTMY); // $latlng = now looks like // array('lat' => '5
$UTM_ZONE = '32';
$UTMX = '60329834,34';
$UTMY = '67382984,9';
$latlng = convert($UTM_ZONE, $UTMX, $UTMY);
// $latlng = now looks like
// array('lat' => '59.4472917501', 'lng' => '5.3928572425')
您要求使用PHP,但这里是javascript。只要加上一些“$”,你就应该很好。这将返回WGS84中的Lat/Lon。无保修,使用风险自负
////////////////////////////////////////////////////////////////////////////////////////////
//
// ToLL - function to compute Latitude and Longitude given UTM Northing and Easting in meters
//
// Description:
// This function converts input north and east coordinates (meters)
// to the corresponding WGS84 Lat/Lon values relative to the defined
// UTM zone.
//
// Parameters:
// north - (i) Northing (meters)
// east - (i) Easting (meters)
// utmZone - (i) UTM Zone of the North and East parameters
// lat - (o) Latitude in degrees
// lon - (o) Longitude in degrees
//
function ToLL(north,east,utmZone)
{
// This is the lambda knot value in the reference
var LngOrigin = DegToRad(utmZone * 6 - 183)
// The following set of class constants define characteristics of the
// ellipsoid, as defined my the WGS84 datum. These values need to be
// changed if a different dataum is used.
var FalseNorth = 0. // South or North?
//if (lat < 0.) FalseNorth = 10000000. // South or North?
//else FalseNorth = 0.
var Ecc = 0.081819190842622 // Eccentricity
var EccSq = Ecc * Ecc
var Ecc2Sq = EccSq / (1. - EccSq)
var Ecc2 = Math.sqrt(Ecc2Sq) // Secondary eccentricity
var E1 = ( 1 - Math.sqrt(1-EccSq) ) / ( 1 + Math.sqrt(1-EccSq) )
var E12 = E1 * E1
var E13 = E12 * E1
var E14 = E13 * E1
var SemiMajor = 6378137.0 // Ellipsoidal semi-major axis (Meters)
var FalseEast = 500000.0 // UTM East bias (Meters)
var ScaleFactor = 0.9996 // Scale at natural origin
// Calculate the Cassini projection parameters
var M1 = (north - FalseNorth) / ScaleFactor
var Mu1 = M1 / ( SemiMajor * (1 - EccSq/4.0 - 3.0*EccSq*EccSq/64.0 -
5.0*EccSq*EccSq*EccSq/256.0) )
var Phi1 = Mu1 + (3.0*E1/2.0 - 27.0*E13/32.0) * Math.sin(2.0*Mu1)
+ (21.0*E12/16.0 - 55.0*E14/32.0) * Math.sin(4.0*Mu1)
+ (151.0*E13/96.0) * Math.sin(6.0*Mu1)
+ (1097.0*E14/512.0) * Math.sin(8.0*Mu1)
var sin2phi1 = Math.sin(Phi1) * Math.sin(Phi1)
var Rho1 = (SemiMajor * (1.0-EccSq) ) / Math.pow(1.0-EccSq*sin2phi1,1.5)
var Nu1 = SemiMajor / Math.sqrt(1.0-EccSq*sin2phi1)
// Compute parameters as defined in the POSC specification. T, C and D
var T1 = Math.tan(Phi1) * Math.tan(Phi1)
var T12 = T1 * T1
var C1 = Ecc2Sq * Math.cos(Phi1) * Math.cos(Phi1)
var C12 = C1 * C1
var D = (east - FalseEast) / (ScaleFactor * Nu1)
var D2 = D * D
var D3 = D2 * D
var D4 = D3 * D
var D5 = D4 * D
var D6 = D5 * D
// Compute the Latitude and Longitude and convert to degrees
var lat = Phi1 - Nu1*Math.tan(Phi1)/Rho1 *
( D2/2.0 - (5.0 + 3.0*T1 + 10.0*C1 - 4.0*C12 - 9.0*Ecc2Sq)*D4/24.0
+ (61.0 + 90.0*T1 + 298.0*C1 + 45.0*T12 - 252.0*Ecc2Sq - 3.0*C12)*D6/720.0 )
lat = RadToDeg(lat)
var lon = LngOrigin +
( D - (1.0 + 2.0*T1 + C1)*D3/6.0
+ (5.0 - 2.0*C1 + 28.0*T1 - 3.0*C12 + 8.0*Ecc2Sq + 24.0*T12)*D5/120.0) / Math.cos(Phi1)
lon = RadToDeg(lon)
// Create a object to store the calculated Latitude and Longitude values
var sendLatLon = new PC_LatLon(lat,lon)
// Returns a PC_LatLon object
return sendLatLon
}
////////////////////////////////////////////////////////////////////////////////////////////
//
//ToLL-计算给定UTM北距和东距的纬度和经度的函数,单位为米
//
//说明:
//此函数用于转换输入的北坐标和东坐标(米)
//相对于定义的WGS84 Lat/Lon值
//UTM区域。
//
//参数:
//北-(i)北距(米)
//东-(i)东距(米)
//UTM区-(i)北部和东部的UTM区参数
//纬度(纬度)(度)
//lon-(o)经度(度)
//
功能收费站(北、东、utmZone)
{
//这是参考中的lambda结值
变量LngOrigin=DegToRad(utmZone*6-183)
//以下一组类常量定义了
//椭球体,如WGS84基准面所定义。这些值需要
//如果使用不同的数据,则会发生更改。
var FalseNorth=0//向南还是向北?
//如果(纬度<0.)北=10000000//南还是北?
//否则,北=0。
var Ecc=0.081819190842622//偏心率
var EccSq=Ecc*Ecc
var Ecc2Sq=EccSq/(1.-EccSq)
var Ecc2=Math.sqrt(Ecc2Sq)//二次偏心率
变量E1=(1-数学sqrt(1-EccSq))/(1+数学sqrt(1-EccSq))
变量E12=E1*E1
变量E13=E12*E1
变量E14=E13*E1
var半长轴=6378137.0//椭球半长轴(米)
var Falseast=500000.0//UTM东偏(米)
var ScaleFactor=0.9996//自然原点处的比例
//计算卡西尼投影参数
变量M1=(北-假北)/ScaleFactor
var Mu1=M1/(半主音*(1-EccSq/4.0-3.0*EccSq*EccSq/64.0)-
5.0*EccSq*EccSq*EccSq/256.0)
var Phi1=Mu1+(3.0*E1/2.0-27.0*E13/32.0)*数学sin(2.0*Mu1)
+(21.0*E12/16.0-55.0*E14/32.0)*数学sin(4.0*Mu1)
+(151.0*E13/96.0)*数学sin(6.0*Mu1)
+(1097.0*E14/512.0)*数学sin(8.0*Mu1)
var sin2phi1=Math.sin(Phi1)*Math.sin(Phi1)
var Rho1=(半专业*(1.0-EccSq))/Math.pow(1.0-EccSq*sin2phi1,1.5)
变量Nu1=半专业/数学sqrt(1.0-EccSq*sin2phi1)
//计算POSC规范中定义的参数。T、C和D
var T1=数学tan(Phi1)*数学tan(Phi1)
变量T12=T1*T1
变量C1=Ecc2Sq*数学cos(Phi1)*数学cos(Phi1)
变量C12=C1*C1
变量D=(东-东)/(ScaleFactor*Nu1)
变量D2=D*D
变量D3=D2*D
变量D4=D3*D
变量D5=D4*D
变量D6=D5*D
//计算纬度和经度并转换为度
var lat=Phi1-Nu1*数学tan(Phi1)/Rho1*
(D2/2.0-(5.0+3.0*T1+10.0*C1-4.0*C12-9.0*Ecc2Sq)*D4/24.0
+(61.0+90.0*T1+298.0*C1+45.0*T12-252.0*Ecc2Sq-3.0*C12)*D6/720.0)
lat=RadToDeg(lat)
var lon=LngOrigin+
(D-(1.0+2.0*T1+C1)*D3/6.0
+(5.0-2.0*C1+28.0*T1-3.0*C12+8.0*Ecc2Sq+24.0*T12)*D5/120.0)/Math.cos(Phi1)
lon=辐射度(lon)
//创建一个对象以存储计算的纬度和经度值
var sendLatLon=新的PC_LatLon(lat,lon)
//返回一个PC_LatLon对象
返回sendLatLon
}
我发现了一个脏类来完成这项工作。我所说的dirty是指函数名不可靠,代码的格式也不是很好,但它确实起到了作用
如果我发现任何更好的类,我一定会更新这个答案。这是PHP中的代码,非常感谢,效果很好
<?php
function ToLL($north, $east, $utmZone)
{
// This is the lambda knot value in the reference
$LngOrigin = Deg2Rad($utmZone * 6 - 183);
// The following set of class constants define characteristics of the
// ellipsoid, as defined my the WGS84 datum. These values need to be
// changed if a different dataum is used.
$FalseNorth = 0; // South or North?
//if (lat < 0.) FalseNorth = 10000000. // South or North?
//else FalseNorth = 0.
$Ecc = 0.081819190842622; // Eccentricity
$EccSq = $Ecc * $Ecc;
$Ecc2Sq = $EccSq / (1. - $EccSq);
$Ecc2 = sqrt($Ecc2Sq); // Secondary eccentricity
$E1 = ( 1 - sqrt(1-$EccSq) ) / ( 1 + sqrt(1-$EccSq) );
$E12 = $E1 * $E1;
$E13 = $E12 * $E1;
$E14 = $E13 * $E1;
$SemiMajor = 6378137.0; // Ellipsoidal semi-major axis (Meters)
$FalseEast = 500000.0; // UTM East bias (Meters)
$ScaleFactor = 0.9996; // Scale at natural origin
// Calculate the Cassini projection parameters
$M1 = ($north - $FalseNorth) / $ScaleFactor;
$Mu1 = $M1 / ( $SemiMajor * (1 - $EccSq/4.0 - 3.0*$EccSq*$EccSq/64.0 - 5.0*$EccSq*$EccSq*$EccSq/256.0) );
$Phi1 = $Mu1 + (3.0*$E1/2.0 - 27.0*$E13/32.0) * sin(2.0*$Mu1);
+ (21.0*$E12/16.0 - 55.0*$E14/32.0) * sin(4.0*$Mu1);
+ (151.0*$E13/96.0) * sin(6.0*$Mu1);
+ (1097.0*$E14/512.0) * sin(8.0*$Mu1);
$sin2phi1 = sin($Phi1) * sin($Phi1);
$Rho1 = ($SemiMajor * (1.0-$EccSq) ) / pow(1.0-$EccSq*$sin2phi1,1.5);
$Nu1 = $SemiMajor / sqrt(1.0-$EccSq*$sin2phi1);
// Compute parameters as defined in the POSC specification. T, C and D
$T1 = tan($Phi1) * tan($Phi1);
$T12 = $T1 * $T1;
$C1 = $Ecc2Sq * cos($Phi1) * cos($Phi1);
$C12 = $C1 * $C1;
$D = ($east - $FalseEast) / ($ScaleFactor * $Nu1);
$D2 = $D * $D;
$D3 = $D2 * $D;
$D4 = $D3 * $D;
$D5 = $D4 * $D;
$D6 = $D5 * $D;
// Compute the Latitude and Longitude and convert to degrees
$lat = $Phi1 - $Nu1*tan($Phi1)/$Rho1 * ( $D2/2.0 - (5.0 + 3.0*$T1 + 10.0*$C1 - 4.0*$C12 - 9.0*$Ecc2Sq)*$D4/24.0 + (61.0 + 90.0*$T1 + 298.0*$C1 + 45.0*$T12 - 252.0*$Ecc2Sq - 3.0*$C12)*$D6/720.0 );
$lat = Rad2Deg($lat);
$lon = $LngOrigin + ($D - (1.0 + 2.0*$T1 + $C1)*$D3/6.0 + (5.0 - 2.0*$C1 + 28.0*$T1 - 3.0*$C12 + 8.0*$Ecc2Sq + 24.0*$T12)*$D5/120.0) / cos($Phi1);
$lon = Rad2Deg($lon);
// Create a object to store the calculated Latitude and Longitude values
$PC_LatLon['lat'] = $lat;
$PC_LatLon['lon'] = $lon;
// Returns a PC_LatLon object
return $PC_LatLon;
}
?>
发布的脚本的结果与我预期的略有不同,但我找到了一个工具,可以提供我预期的结果。 我在这里制作了一个PHP版本:
为了完整性,打包在Composer中的另一个选项是 这不是很好的记录,但它看起来像是结合了东距、北距和区域,你可以返回纬度和经度。例如:
$easting = 505716.941;
$northing = 6961780.872;
$zone = 56;
$UTMRef = new PHPCoord\UTMRef($easting, $northing, NULL, $zone, $zone);
$LatLng = $UTMRef->toLatLng();
print "Lat/Lng:" . $LatLng->getLat() . ", " . $LatLng->getLng() . "\n";
注意,它似乎没有上面提到的gPoint那么准确。我知道现在回答这个问题已经晚了,但因为我不能使用上面的任何代码,所以我编写了自己的版本,实际上非常容易使用。 这是地址: 要将UTM转换为LatLong,请执行以下操作:
utm2ll(729286.9550018794,4021544.8279992654,40,true);
输出:
{"success":true,"attr":{"lat":36.311665575271,"lon":59.553858137274}}
{"success":true,"attr":{"x":729286.95500188,"y":4021544.8279993,"zone":40,"aboveEquator":true}}
要将LatLong转换为UTM,请执行以下操作:
ll2utm(36.311665575277935,59.55385813725379);
输出:
{"success":true,"attr":{"lat":36.311665575271,"lon":59.553858137274}}
{"success":true,"attr":{"x":729286.95500188,"y":4021544.8279993,"zone":40,"aboveEquator":true}}
希望有帮助。另一种可能是proj4ppp()软件包。非常强大,它允许在许多不同的坐标系之间进行转换。这是一个如何使用的示例。我从这里提取文件:并使用它:
$easting=505716.941$北距=6961780.872$分区=56$gPoint=新gPoint(“澳大利亚国民”)$gPoint->setUTM($easting,$northing,$zone)$gPoint->converttmttoll();打印“Lat/Lng:”$gPoint->Lat()。", " . $gPoint->Long()。“\n”代码>伙计,你是最棒的!