Detecting whether a GPS coordinate falls within a polygon on a map

前端 未结 8 1323
野趣味
野趣味 2020-12-07 10:17

As stated in the title, the goal is to have a way for detecting whether a given GPS coordinate falls inside a polygon or not.

The polygon itself can be either convex

8条回答
  •  忘掉有多难
    2020-12-07 11:02

    JavaScript Version -

    {
    const PI = 3.14159265;
    const TWOPI = 2*PI;
    function isCoordinateInsidePitch(latitude, longitude, latArray, longArray)
    {       
           let angle=0;
           let p1Lat;
           let p1Long;
           let p2Lat;
           let p2Long;
           let n = latArray.length;
    
           for (let i = 0; i < n; i++) {
              p1Lat = latArray[i] - latitude;
              p1Long = longArray[i] - longitude;
              p2Lat = latArray[(i+1)%n] - latitude;
              p2Long = longArray[(i+1)%n] - longitude;
              angle += angle2D(p1Lat,p1Long,p2Lat,p2Long);
           }
    
           return !(Math.abs(angle) < PI);
    }
    
    function angle2D(y1, x1, y2, x2)
    {
       let dtheta,theta1,theta2;
    
       theta1 = Math.atan2(y1,x1);
       theta2 = Math.atan2(y2,x2);
       dtheta = theta2 - theta1;
       while (dtheta > PI)
          dtheta -= TWOPI;
       while (dtheta < -PI)
          dtheta += TWOPI;
    
       return dtheta;
    }
    
    function isValidCoordinate(latitude,longitude)
    {
        return (
        latitude !== '' && longitude !== '' && !isNaN(latitude) 
         && !isNaN(longitude) && latitude > -90 &&
         latitude < 90 && longitude > -180 && longitude < 180
         )
    }
    let latArray = [32.10458, 32.10479, 32.1038, 32.10361];
    let longArray = [34.86448, 34.86529, 34.86563, 34.86486];
    // true
    console.log(isCoordinateInsidePitch(32.104447, 34.865108,latArray, longArray));
    // false
    // isCoordinateInsidePitch(32.104974, 34.864576,latArray, longArray);
    // true
    // isValidCoordinate(0, 0)
    // true
    // isValidCoordinate(32.104974, 34.864576)
    }

提交回复
热议问题