Google Maps v3: check if point exists in polygon

后端 未结 7 1855
-上瘾入骨i
-上瘾入骨i 2020-11-27 14:09

I am looking to find a way of checking if a point exists inside a polygon in Google Maps v3 (JavaScript). I\'ve searched everywhere and the only solutions I have found so fa

相关标签:
7条回答
  • 2020-11-27 14:19

    You have a very good example of containsLocation() method in Google Maps API documentation.

    0 讨论(0)
  • 2020-11-27 14:23

    You should have a look about the Gmaps.js library. It has a quite simple method about geofence.

    0 讨论(0)
  • 2020-11-27 14:24
    var coordinate = new google.maps.LatLng(0.457301,-0.597382);//replace with your lat and lng values
    var isWithinPolygon = google.maps.geometry.poly.containsLocation(coordinate, yourPolygon);
    

    Dont forget to include the library in your googleapis script. Read more...

    <script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&libraries=geometry"></script>
    
    0 讨论(0)
  • 2020-11-27 14:31

    The example and implementation do not take into account that a polygon can cross the 180 degrees boundary.

    The implementation does take it into account (implicitly) in the bounding box check, but the polygon check fails.

    0 讨论(0)
  • 2020-11-27 14:32

    I have used the same thing and working fine and its offline code I have written this code in PHP you can write it any programming language.

    class pointLocation {
        var $pointOnVertex = true; // Check if the point sits exactly on one of the vertices?
    
        function pointLocation() {
        }
    
        function pointInPolygon($point, $polygon, $pointOnVertex = true) {
            $this->pointOnVertex = $pointOnVertex;
    
            // 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 ($this->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";
            }
        }
    
        function pointOnVertex($point, $vertices) {
            foreach($vertices as $vertex) {
                if ($point == $vertex) {
                    return true;
                }
            }
    
        }
    
        function pointStringToCoordinates($pointString) {
            $coordinates = explode(" ", $pointString);
            return array("x" => $coordinates[0], "y" => $coordinates[1]);
        }
    
    }
    
    $pointLocation = new pointLocation();
    $points = array("22.732965336387213 75.8609390258789");
    $polygon = array("22.73549852921309 75.85424423217773","22.72346544538196 75.85561752319336","22.72346544538196 75.87175369262695","22.732332030848273 75.87295532226562","22.740406456758326 75.8686637878418","22.74198962160603 75.85407257080078");
    echo '<pre>';
    print_r($polygon);
    // The last point's coordinates must be the same as the first one's, to "close the loop"
    foreach($points as $key => $point) {
        echo "point " . ($key+1) . " ($point): " . $pointLocation->pointInPolygon($point, $polygon) . "<br>";
    }
    

    ?>

    0 讨论(0)
  • 2020-11-27 14:34

    One algorithm to solve this is ray-casting. See an explanation here.

    And you can find code implementing this for the Google Maps JS API V3 here.

    HTH.

    0 讨论(0)
提交回复
热议问题