How to detect if a point is in a Circle?

前端 未结 6 765
广开言路
广开言路 2020-12-02 00:26

How can I test if a LatLng point is within the bounds of a circle? (Google Maps JavaScript v3)

The getBounds() method returns the bounding box for the circle, which

相关标签:
6条回答
  • 2020-12-02 00:59

    Something like this should do the trick (code not tested):

    public boolean pointInCircle(Circle c, LatLng coord) {
      Rectangle r = c.getBounds();
      double rectX = r.getX();
      double rectY = r.getY();
      double rectWidth = r.getWidth();
      double rectHeight = r.getHeight();
    
      double circleCenterX = rectX + rectWidth/2;
      double circleCenterY = rectY + rectHeight/2;
    
      double lat = coord.getLatitude();
      double lon = coord.getLongitude();
    
      // Point in circle if (x−h)^2 + (y−k)^2 <= r^2
      double rSquared = Math.pow(rectWidth/2, 2);
      double point = Math.pow(lat - circleCenterX, 2) + Math.pow(lon - circleCenterY, 2);
    
      return (point <= rSquared) ? true : false;
    }
    
    0 讨论(0)
  • 2020-12-02 01:03

    You could just do the distance comparison manually, fairly trivially.

    (x1 - x2)^2 + (y1 - y2)^2 <= D^2 
    
    0 讨论(0)
  • 2020-12-02 01:03

    Try this (Javascript):

    const toRadians = (val) => {
       return val * Math.PI / 180;
    }
    const toDegrees = (val) => {
       return val * 180 / Math.PI;
    }
    // Calculate a point winthin a circle
    // circle ={center:LatLong, radius: number} // in metres
    const pointInsideCircle = (point, circle) => {
        let center = circle.center;
        let distance = distanceBetween(point, center);
    
        return distance < circle.radius; // Use '<=' if you want to get all points in the border
    };
    
    const distanceBetween = (point1, point2) => {
        var R = 6371e3; // metres
        var φ1 = toRadians(point1.latitude);
        var φ2 = toRadians(point2.latitude);
        var Δφ = toRadians(point2.latitude - point1.latitude);
        var Δλ = toRadians(point2.longitude - point1.longitude);
    
        var a = Math.sin(Δφ / 2) * Math.sin(Δφ / 2) +
                Math.cos(φ1) * Math.cos(φ2) *
                Math.sin(Δλ / 2) * Math.sin(Δλ / 2);
        var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
    
        return R * c;
    }
    

    References: http://www.movable-type.co.uk/scripts/latlong.html

    This npm helper module does the same thing and returns a boolean as to whether the item is in the circle.

    https://www.npmjs.com/package/fencery

    0 讨论(0)
  • 2020-12-02 01:04

    You might use the Circle object to show it;

    new google.maps.Circle({
                map : map,
                center : new google.maps.LatLng(lat,lng),
                strokeColor:'#00FFCC',
                strokeWeight:2,
                fillOpacity:0,
                radius:radiusm
            });
    

    And apply the Pythagorean theorem to coordinates: but in this case to make it a "real" circle since the ration between 1° of lat and longitude varies across latitudes, you should at the very least adjust them like:

    var kmRadius = 100; //(radius of 100 km)
    var lat_gap = kmRadius/111.1;
    var lng_gap = lat_gap / Math.cos(lat / (Math.PI/180));
    
    0 讨论(0)
  • 2020-12-02 01:07

    Why don't you simple calculate this with Pythagorean theorem? You know a²+b²=c². If c is lower than r (radius) you know it is inside.

    var isInside=Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2) >= r*r;
    
    0 讨论(0)
  • 2020-12-02 01:10

    Use the spherical geometry library (be sure to include it with the API)

    function pointInCircle(point, radius, center)
    {
        return (google.maps.geometry.spherical.computeDistanceBetween(point, center) <= radius)
    }
    
    0 讨论(0)
提交回复
热议问题