ทำในภาษา PHP:
// สมมติว่าระดับความสูง = 0
$ earthR = 6371; // เป็นกม. (= 3959 เป็นไมล์)
$ LatA = 37.418436;
$ LonA = -121.963477;
$ DistA = 0.265710701754;
$ LatB = 37.417243;
$ LonB = -121.961889;
$ DistB = 0.234592423446;
$ LatC = 37.418692;
$ LonC = -121.960194;
$ DistC = 0.0548954278262;
/ *
#using ทรงกลม authalic
# หากใช้รูปวงรีขั้นตอนนี้จะแตกต่างกันเล็กน้อย
# แปลง geodetic Lat / Long เป็น ECEF xyz
# 1. แปลง Lat / Long เป็นเรเดียน
# 2. แปลง Lat / Long (เรเดียน) เป็น ECEF
* /
$ xA = $ earthR * (cos (deg2rad ($ LatA)) * cos (deg2rad ($ LonA)));
$ yA = $ earthR * (cos (deg2rad ($ LatA)) * sin (deg2rad ($ LonA)));
$ zA = $ earthR * (sin (deg2rad ($ LatA)));
$ xB = $ earthR * (cos (deg2rad ($ LatB)) * cos (deg2rad ($ LonB)));
$ yB = $ earthR * (cos (deg2rad ($ LatB)) * sin (deg2rad ($ LonB)));
$ zB = $ earthR * (sin (deg2rad ($ LatB)));
$ xC = $ earthR * (cos (deg2rad ($ LatC)) * cos (deg2rad ($ LonC)))
$ yC = $ earthR * (cos (deg2rad ($ LatC)) * sin (deg2rad ($ LonC)))
$ zC = $ earthR * (sin (deg2rad ($ LatC)));
/ *
ติดตั้ง:
sudo pear ติดตั้ง Math_Vector-0.7.0
sudo pear ติดตั้ง Math_Matrix-0.8.7
* /
// รวมลูกแพร์ :: Math_Matrix
// /usr/share/php/Math/Matrix.php
// include_path = ".: / usr / local / php / pear /"
require_once 'Math / Matrix.php';
require_once 'Math / Vector.php';
require_once 'Math / Vector3.php';
$ P1vector = ใหม่ Math_Vector3 (อาร์เรย์ ($ xA, $ yA, $ zA));
$ P2vector = ใหม่ Math_Vector3 (อาร์เรย์ ($ xB, $ yB, $ zB));
$ P3vector = ใหม่ Math_Vector3 (อาร์เรย์ ($ xC, $ yC, $ zC));
#from wikipedia: http://en.wikipedia.org/wiki/Trilateration
#transform เพื่อรับวงกลม 1 ที่จุดเริ่มต้น
#transform เพื่อรับวงกลม 2 บนแกน x
// CALC EX
$ P2minusP1 = Math_VectorOp :: substract ($ P2vector, $ P1vector);
$ l = ใหม่ Math_Vector ($ P2minusP1);
$ P2minusP1_length = $ l-> length ();
$ norm = ใหม่ Math_Vector3 (อาร์เรย์ ($ P2minusP1_length, $ P2minusP1_length, $ P2minusP1_length));
$ d = $ ปกติ; // บันทึก calc D
$ ex = Math_VectorOp :: divide ($ P2minusP1, $ norm);
// echo "ex:". $ ex-> toString (). "\ n";
$ ex_x = floatval ($ ex -> _ tuple-> getData () [0]);
$ ex_y = floatval ($ ex -> _ tuple-> getData () [1]);
$ ex_z = floatval ($ ex -> _ tuple-> getData () [2]);
$ ex = ใหม่ Math_Vector3 (อาร์เรย์ ($ ex_x, $ ex_y, $ ex_z));
// CALC i
$ P3minusP1 = Math_VectorOp :: substract ($ P3vector, $ P1vector);
$ P3minusP1_x = floatval ($ P3minusP1 -> _ tuple-> getData () [0]);
$ P3minusP1_y = floatval ($ P3minusP1 -> _ tuple-> getData () [1]);
$ P3minusP1_z = floatval ($ P3minusP1 -> _ tuple-> getData () [2]);
$ P3minusP1 = Math_Vector3 ใหม่ (อาร์เรย์ ($ P3minusP1_x, $ P3minusP1_y, $ P3minusP1_z));
$ i = Math_VectorOp :: dotProduct ($ ex, $ P3minusP1);
// echo "i = $ i \ n";
// CALC EY
$ iex = Math_VectorOp :: scale ($ i, $ ex);
// echo "iex =". $ iex-> toString (). "\ n";
$ P3P1iex = Math_VectorOp :: substract ($ P3minusP1, $ iex);
// echo "P3P1iex =". $ P3P1iex-> toString (). "\ n";
$ l = ใหม่ Math_Vector ($ P3P1iex);
$ P3P1iex_length = $ l-> length ();
$ norm = Math_Vector3 ใหม่ (อาร์เรย์ ($ P3P1iex_length, $ P3P1iex_length, $ P3P1iex_length));
// echo "norm:". $ norm-> toString (). "\ n";
$ ey = Math_VectorOp :: หาร ($ P3P1iex, $ ปกติ);
// echo "ey =". $ ey-> toString (). "\ n";
$ ey_x = floatval ($ ey -> _ tuple-> getData () [0]);
$ ey_y = floatval ($ ey -> _ tuple-> getData () [1]);
$ ey_z = floatval ($ ey -> _ tuple-> getData () [2]);
$ ey = Math_Vector3 ใหม่ (อาร์เรย์ ($ ey_x, $ ey_y, $ ey_z));
// CALC EZ
$ ez = Math_VectorOp :: crossProduct ($ ex, $ ey);
// echo "ez =". $ ez-> toString (). "\ n";
// CALC D
// ทำได้ก่อน
$ d = floatval ($ d -> _ tuple-> getData () [0]);
// echo "d = $ d \ n";
// CALC J
$ j = Math_VectorOp :: dotProduct ($ ey, $ P3minusP1);
// echo "j = $ j \ n";
#from วิกิพีเดีย
#plug และ chug โดยใช้ค่าด้านบน
$ x = (pow ($ DistA, 2) - pow ($ DistB, 2) + pow ($ d, 2)) / (2 * $ d);
$ y = ((pow ($ DistA, 2)) - pow ($ DistC, 2) + pow ($ i, 2) + pow ($ j, 2)) / (2 * $ j)) - (($ i / $ ญ) * $ x);
แสดงเพียงหนึ่งกรณีเท่านั้นที่นี่
$ z = sqrt (pow ($ DistA, 2) - pow ($ x, 2) - pow ($ y, 2))
// echo "x = $ x - y = $ y - z = $ z \ n";
#triPt เป็นอาร์เรย์ที่มี ECEF x, y, z ของจุด trilateration
$ xex = Math_VectorOp :: scale ($ x, $ ex);
$ yey = Math_VectorOp :: scale ($ y, $ ey);
$ zez = Math_VectorOp :: scale ($ z, $ ez);
// CALC $ triPt = $ P1vector + $ xex + $ yey + $ zez;
$ triPt = Math_VectorOp :: เพิ่ม ($ P1vector, $ xex);
$ triPt = Math_VectorOp :: เพิ่ม ($ triPt, $ yey);
$ triPt = Math_VectorOp :: เพิ่ม ($ triPt, $ zez);
// echo "triPt =". $ triPt-> toString (). "\ n";
$ triPt_x = floatval ($ triPt -> _ tuple-> getData () [0]);
$ triPt_y = floatval ($ triPt -> _ tuple-> getData () [1]);
$ triPt_z = floatval ($ triPt -> _ tuple-> getData () [2]);
#convert กลับเป็น lat / long จาก ECEF
#convert เป็นองศา
$ lat = rad2deg (asin ($ triPt_z / $ earthR));
$ lon = rad2deg (atan2 ($ triPt_y, $ triPt_x));
echo $ lat. ',' $ lon;