【问题标题】:How can I get all coordinates between two points polyline如何获得两点折线之间的所有坐标
【发布时间】:2019-06-19 12:32:09
【问题描述】:

我怎样才能找到折线上两点之间的所有坐标。 我不需要距离或只需要中点。

假设我有两点

  1. A 点(左)纬度:39.091868 长:-9.263187
  2. B 点(右)纬度:39.089815 经度:-9.261857

点 A 到 B 获取所有坐标位于屏幕截图下方的行

【问题讨论】:

  • 您知道两点之间的点数是无限的吗?
  • “所有坐标”是什么意思?您是否有一些数据要针对这两点进行验证?另外,你有什么办法来解决这个问题?
  • @obscure 我们需要存在于两个顶点之间的折线上的所有坐标...
  • @SebastianGaweda 不,我们没有坐标 .. 我们需要存在于两个顶点之间的折线上的谷歌地图坐标
  • @RafiUllahPatel 我只是想说您需要限制点数,因为理论上它是无限的。既然您在谈论折线,您想获得这些点的完整像素整数值吗?也许您应该添加您所指的屏幕截图。

标签: javascript google-maps leaflet leaflet.draw


【解决方案1】:

我们得到两点之间的距离并检查距离是否低于 3 米或任何值。结果返回true后,我们调用递归函数。 函数 getTwoPointMidCoord($coordinates) {

$num_coords = count($coordinates);

$sumY = 0;
$sumZ = 0;
$LATIDX = 0;
$LNGIDX = 1;
$sumX = 0;
$sumY = 0;
$sumZ = 0;

foreach ($coordinates as $key => $value) {
$lat = deg2rad($value[0]);
$lng = deg2rad($value[1]);
$sumX += cos($lat) * cos($lng);
$sumY += cos($lat) * sin($lng);
$sumZ += sin($lat);
}

$avgX = $sumX / 2;
$avgY = $sumY / 2;
$avgZ = $sumZ / 2;

$lng = atan2($avgY, $avgX);
$hyp = sqrt($avgX * $avgX + $avgY * $avgY);
$lat = atan2($avgZ, $hyp);
return ([rad2deg($lat), rad2deg($lng)]);
}

【讨论】:

    【解决方案2】:

    正如我在我的 cmets 中提到的,不可能将所有点放在一条线上,因为数量是无限的。

    但是,您可以返回固定数量的积分。不过,这个数字很大程度上取决于您想要达到的精度水平。

    Point = function(x, y) {
      this.x = x;
      this.y = y;
    }
    var pointA = new Point(39.091868, -9.263187);
    var pointB = new Point(39.089815, -9.261857);
    
    var numberOfPoints = 20;
    var points = new Array();
    
    for (var i = 0; i < numberOfPoints; i++) {
      points.push(new Point((Math.abs(pointA.x - pointB.x) / 10) * i + pointB.y, (Math.abs(pointA.y - pointB.y) / numberOfPoints) * i + pointB.y));
    }
    
    console.log(points);

    【讨论】:

    • 数组 x 和 y 中缺少 lat 显示两个 long 值 0:点 x:-9.261857 y:-9.261857 proto:对象 1:点 x:-9.261790499999998 y: -9.261790499999998 proto:对象 2:点
    • 哦,抱歉,Point 定义中有一个小类型。我修复了上面的例子!
    • 请注意,这适用于平面上的欧几里得几何,但不适用于大地测量 - 大地解决方案将涉及计算包含两个点的大圆弧。
    • 对我来说,它还显示 x 和 y 作为长值,例如:'Point { x: -9.261857, y: -9.261790499999998}。我该如何解决这个问题,以便纬度将值显示为 x?
    【解决方案3】:

    是的,这是可能的。我们得到两点之间的距离并检查距离是否低于 3 米或任何值。结果返回true后,我们调用递归函数。 PHP 代码。

    global $array;
    $array = array();
    
    function recurCollectCoords($coords) {
    global $array;
    $coords = array(
        array(24.925274, 67.096988),
        array(24.924872, 67.097367),
        array(24.924946, 67.097481)
    );
    foreach ($coords as $key => $value) {
        if (isset($coords[$key + 1])) {
    $distance = distance($value[0], $value[1], $coords[$key + 1][0], $coords[$key + 1] 
    [1], "M");
    if ($distance > 3) { //Using each coordinate collect 3 meter distance 
    $coordinates = array(array($value[0], $value[1]), array($coords[$key + 1][0], 
    $coords[$key + 1][1]));
    $midpoint = getTwoPointMidCoord($coordinates);
    $newCoord[] = array(array($value[0], $value[1]), array($midpoint[0], 
    $midpoint[1]), array($coords[$key + 1][0], $coords[$key + 1][1]));
    recurCollectCoords(call_user_func_array('array_merge', $newCoord));
    } else {
    array_push($array, array((string) $value[0], (string) $value[1]));
            }
        }
    array_push($array, array((string) $value[0], (string) $value[1]));
    }
    $uniqueCoords = array_values(array_map("unserialize", 
    array_unique(array_map("serialize", $array))));
    return $uniqueCoords;
    }
    
    function distance($lat1, $lon1, $lat2, $lon2, $unit) {
    if (($lat1 == $lat2) && ($lon1 == $lon2)) {
        return 0;
    } else {
        $theta = $lon1 - $lon2;
        $dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1)) * 
    cos(deg2rad($lat2)) * cos(deg2rad($theta));
        $dist = acos($dist);
        $dist = rad2deg($dist);
        $miles = $dist * 60 * 1.1515;
        $unit = strtoupper($unit);
    
        if ($unit == "K") {
            return ($miles * 1.609344);
        } else if ($unit == "N") {
            return ($miles * 0.8684);
        } else if ($unit == "M") {
            return ($miles * 1.609344) * 1000;
        } else {
            return $miles;
        }
    }
    

    }

    function getTwoPointMidCoord($coordinates) {
    
    $num_coords = count($coordinates);
    
    $sumY = 0;
    $sumZ = 0;
    $LATIDX = 0;
    $LNGIDX = 1;
    $sumX = 0;
    $sumY = 0;
    $sumZ = 0;
    
    foreach ($coordinates as $key => $value) {
        $lat = deg2rad($value[0]);
        $lng = deg2rad($value[1]);
        $sumX += cos($lat) * cos($lng);
        $sumY += cos($lat) * sin($lng);
        $sumZ += sin($lat);
    }
    
    $avgX = $sumX / 2;
    $avgY = $sumY / 2;
    $avgZ = $sumZ / 2;
    
    $lng = atan2($avgY, $avgX);
    $hyp = sqrt($avgX * $avgX + $avgY * $avgY);
    $lat = atan2($avgZ, $hyp);
    return ([rad2deg($lat), rad2deg($lng)]);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-10
      • 1970-01-01
      • 2012-11-09
      • 2017-01-05
      • 1970-01-01
      • 2021-01-08
      相关资源
      最近更新 更多