2011-06-29 39 views
27

Tôi đang tìm cách tìm một điểm kiểm tra xem có tồn tại một điểm trong đa giác trong Google Maps v3 (JavaScript) hay không. Tôi đã tìm kiếm ở khắp mọi nơi và các giải pháp duy nhất mà tôi đã tìm thấy cho đến nay là làm việc với các giới hạn của đa giác, nhưng mã được hiển thị chỉ tạo hình chữ nhật và tiếp tục mở rộng diện tích bề mặt của nó để bao gồm tất cả các điểm liên quan.Google Maps v3: kiểm tra xem điểm có tồn tại trong đa giác

Nhân tiện, lý do tôi không thể sử dụng một hình vuông lớn, tức là nhận được một đa giác, là tôi có các đa giác xung quanh trên bản đồ và chúng không thể mở rộng ra lãnh thổ của nhau.

EDIT Theo sau từ trả lời bên dưới, tôi đã thử triển khai mã ví dụ bằng một trong các đa giác hiện có của tôi nhưng nó chỉ nói rằng nó không được xác định và tôi không thể hiểu tại sao.

Đây là tuyên bố của tôi:

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); 

và đây là nơi tôi đang kiểm tra cho điểm:

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

Nhưng nó vẫn không ngừng đến với các lỗi: ReferenceError chưa gặp: rightShoulderFront không được định nghĩa

Trả lời

36

Một thuật toán để giải quyết điều này là tạo hình. Xem giải thích here.

Và bạn có thể tìm mã triển khai thực hiện điều này cho API JS API V3 here của Google Maps.

HTH.

3

Ví dụ và triển khai không tính đến một đa giác có thể vượt qua ranh giới 180 độ.

Việc triển khai thực hiện đưa vào tài khoản (ngầm) trong kiểm tra hộp giới hạn, nhưng kiểm tra đa giác không thành công.

19

Bạn có thể làm điều này khá đơn giản với thư viện hình học bản đồ của Google.

Trước tiên, hãy chắc chắn thêm thư viện hình học của bản đồ google.

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

Sau đó, xác định đa giác của bạn

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

Tôi sẽ nghe thêm một sự kiện để xử lý một sự kiện nghe tiếng 'click', nhưng bạn có thể điều chỉnh để phù hợp với nhu cầu của bạn

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

Tạo một hàm để xử lý sự kiện nhấp chuột của chúng tôi là séc nếu tọa độ tồn tại trong đa giác bằng thư viện hình học của Google

/** @this {google.maps.Polygon} */ 
function isWithinPoly(event){ 
    var isWithinPolygon = google.maps.geometry.poly.containsLocation(event.latLng, this); 
    console.log(isWithinPolygon); 
} 
+2

Có bất kỳ hạn chế đặt bởi Google về việc sử dụng phương pháp này, 'containsLocation()'? –

4

Bạn nên có một cái nhìn về thư viện Gmaps.js. Nó có một phương pháp khá đơn giản về geofence.

7

Bạn có phương thức example của phương thức containsLocation() trong tài liệu API Google Maps.

1
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); 

Đừng quên đưa thư viện vào tập lệnh googleapis của bạn.Read more...

<script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&libraries=geometry"></script> 
0

Tôi đã sử dụng điều tương tự và làm việc tốt và mã ẩn của nó tôi đã viết mã này trong PHP bạn có thể viết nó bất kỳ ngôn ngữ lập trình.

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

?>

Các vấn đề liên quan