Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
开源PHP函数,用于将UTM坐标转换为纬度和经度?_Php_Latitude Longitude_Utm - Fatal编程技术网

开源PHP函数,用于将UTM坐标转换为纬度和经度?

开源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

我正在制作一个涉及谷歌地图的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' => '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”伙计,你是最棒的!