Google Maps v3: vérifiez si le point existe dans polygon

<!-Je cherche un moyen de vérifier si un point existe à l'intérieur d'un polygone dans Google Maps v3 (JavaScript). J'ai cherché partout et les seules solutions que j'ai trouvées jusqu'à présent ont été d'obtenir les limites du polygone, mais le code montré semble juste créer un rectangle et continue d'étendre sa surface pour inclure tous les points pertinents.

au fait, la raison pour laquelle je ne peux pas simplement utiliser un grand carré, c'est-à-dire obtenir des limites de polygones, c'est que j'ai des polygones limitrophes sur la carte, et ils ne peuvent pas se dilater dans l'autre territoire.

modifier Suite à la réponse ci-dessous, j'ai essayé de mettre en œuvre le code d'exemple en utilisant un de mes polygones existants, mais il est juste dire qu'il n'est pas défini et je ne peux pas comprendre pourquoi.

Voici ma déclaration:

myCoordinates = [
    new google.maps.LatLng(0.457301,-0.597382),
    new google.maps.LatLng(0.475153,-0.569916),
    new google.maps.LatLng(0.494379,-0.563049),
    new google.maps.LatLng(0.506738,-0.553436),
    new google.maps.LatLng(0.520470,-0.541077),
    new google.maps.LatLng(0.531456,-0.536957),
    new google.maps.LatLng(0.556174,-0.552063),
    new google.maps.LatLng(0.536949,-0.596008),
    new google.maps.LatLng(0.503991,-0.612488),
    new google.maps.LatLng(0.473780,-0.612488) ];

polyOptions = { 
    path: myCoordinates,
    strokeColor: "#FF0000",
    strokeOpacity: 0.8,
    strokeWeight: 2,
    fillColor: "#0000FF",
    fillOpacity: 0.6 };

var rightShoulderFront = new google.maps.Polygon(polyOptions);
rightShoulderFront.setMap(map);

et c'est là où je suis vérification pour le point:

var coordinate = selectedmarker.getPosition();
var isWithinPolygon = rightShoulderFront.containsLatLng(coordinate);
console.log(isWithinPolygon);

mais il continue à venir avec l'erreur: Uncaught ReferenceError: rightShoulderFront n'est pas défini

27
demandé sur halfer 2011-06-29 18:37:39

7 réponses

un algorithme pour résoudre ce problème est ray-casting. Voir une explication ici.

et vous pouvez trouver du code de mise en œuvre pour L'API JS de Google Maps V3 ici.

HTH.

37
répondu mhyfritz 2011-06-29 14:43:26

vous pouvez le faire tout simplement avec Google maps geometry library.

tout d'abord, assurez-vous d'ajouter la bibliothèque de géométrie de google maps.

<script type="text/javascript" src="//maps.googleapis.com/maps/api/js?libraries=geometry&sensor=false"></script>

alors, définissez votre polygone

var rightShoulderFront = new google.maps.Polygon({
            paths: myCoordinates
        });
rightShoulderFront .setMap(map);

je vais ajouter un écouteur d'événements pour gérer un événement' click', mais vous pouvez vous adapter à vos besoins

google.maps.event.addListener(rightShoulderFront , 'click', isWithinPoly);

créer une fonction pour gérer notre événement de clic une vérification si la coordonnée existe dans polygon en utilisant la bibliothèque de géométrie de Google

/** @this {google.maps.Polygon} */
function isWithinPoly(event){
   var isWithinPolygon = google.maps.geometry.poly.containsLocation(event.latLng, this);
    console.log(isWithinPolygon);
}
19
répondu Kyle 2013-05-21 16:53:37

Vous avez une très bonne exemplecontainsLocation() méthode dans la documentation de L'API GoogleMaps.

7
répondu Damjan Pavlica 2016-08-24 09:27:29

Vous devez avoir un coup d'oeil sur le Gmaps.js bibliothèque. Il a une méthode très simple au sujet de la géofence.

5
répondu vtproduction 2014-04-13 08:18:29

l'exemple et la mise en œuvre ne tiennent pas compte du fait qu'un polygone peut franchir la limite de 180 degrés.

l'implémentation en tient compte (implicitement) dans la case de limitation, mais la vérification polygonale échoue.

3
répondu rikkertkoppes 2011-07-25 13:51:43
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);

N'oubliez pas d'inclure la bibliothèque dans votre script googleapis. Lire la suite...

<script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&libraries=geometry"></script>
1
répondu Bruce Phillip Perez 2017-05-26 05:27:15

j'ai utilisé la même chose et travailler très bien et son code hors ligne j'ai écrit ce code en PHP vous pouvez l'écrire n'importe quel langage de programmation.

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>";
}

?>

1
répondu vinod gami 2017-12-04 11:10:13