0

我创建了一个 api 来检查移动设备是否在多边形内并靠近兴趣点,在这两个功能下方使用。每 5-10 秒从 100 个设备(200 个直到年底)调用此 api。该服务器是一个具有 8 个 vCPU AMD Ryzen Threadripper 的 VPS,它正在加载。RAM、mysql 和 I/0 正常。在添加更多 vCPU 之前,我想知道是否可以优化代码或者通常是 CPU 使用率。

function haversineGreatCircleDistance($latitudeFrom, $longitudeFrom, $latitudeTo, $longitudeTo, $earthRadius = 6371000)
  {
    // convert from degrees to radians
    $latFrom = deg2rad($latitudeFrom);
    $lonFrom = deg2rad($longitudeFrom);
    $latTo = deg2rad($latitudeTo);
    $lonTo = deg2rad($longitudeTo);

    $latDelta = $latTo - $latFrom;
    $lonDelta = $lonTo - $lonFrom;

    $angle = 2 * asin(sqrt(pow(sin($latDelta / 2), 2) +
        cos($latFrom) * cos($latTo) * pow(sin($lonDelta / 2), 2)));
    return $angle * $earthRadius;
  }

  
  function pointInPolygon($point, $polygon, $pointOnVertex = false)
  {

    // Transform string coordinates into arrays with x and y values
    $point = $this->pointStringToCoordinates($point);
    $vertices = array();
    foreach ($polygon as $vertex) {
      $vertices[] = $this->pointStringToCoordinates($vertex);
    }

    // Check if the point sits exactly on a vertex
    if ($pointOnVertex == true and $this->pointOnVertex($point, $vertices) == true) {
      return "vertex";
    }

    // Check if the point is inside the polygon or on the boundary
    $intersections = 0;
    $vertices_count = count($vertices);

    for ($i = 1; $i < $vertices_count; $i++) {
      $vertex1 = $vertices[$i - 1];
      $vertex2 = $vertices[$i];
      if ($vertex1['y'] == $vertex2['y'] and $vertex1['y'] == $point['y'] and $point['x'] > min($vertex1['x'], $vertex2['x']) and $point['x'] < max($vertex1['x'], $vertex2['x'])) { // Check if point is on an horizontal polygon boundary
        return "boundary";
      }
      if ($point['y'] > min($vertex1['y'], $vertex2['y']) and $point['y'] <= max($vertex1['y'], $vertex2['y']) and $point['x'] <= max($vertex1['x'], $vertex2['x']) and $vertex1['y'] != $vertex2['y']) {
        $xinters = ($point['y'] - $vertex1['y']) * ($vertex2['x'] - $vertex1['x']) / ($vertex2['y'] - $vertex1['y']) + $vertex1['x'];
        if ($xinters == $point['x']) { // Check if point is on the polygon boundary (other than horizontal)
          return "boundary";
        }
        if ($vertex1['x'] == $vertex2['x'] || $point['x'] <= $xinters) {
          $intersections++;
        }
      }
    }
    // If the number of edges we passed through is odd, then it's in the polygon.
    if ($intersections % 2 != 0) {
      return "inside";
    }
    else {
      return "outside";
    }
  }
4

0 回答 0