2010-11-08 18 views

Trả lời

4

Tôi không nghĩ rằng bạn có thể xác định xem một điểm là một con đường hay một tòa nhà hoàn toàn với dữ liệu Google Maps. Để làm điều này tôi nghĩ rằng bạn sẽ cần một số nguồn dữ liệu bổ sung.

Tuy nhiên, bạn có thể xác định xem một điểm có phải là con đường hay không bằng cách sử dụng kỹ thuật Snap point to street.

Tôi đã viết lại kỹ thuật này để sử dụng API Google Maps v3 và thêm chức năng Haversine để cho bạn biết khoảng cách (tính bằng km) giữa điểm được nhấp gốc và điểm tương ứng trên đường gần nhất.

<!DOCTYPE html> 
<html> 
<head> 
<meta name="viewport" content="initial-scale=1.0, user-scalable=no"/> 
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/> 
<title>Google Maps JavaScript API v3 Example: Directions Simple</title> 
<link href="http://code.google.com/apis/maps/documentation/javascript/examples/default.css" rel="stylesheet" type="text/css" /> 
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script> 
<script type="text/javascript"> 

rad = function(x) {return x*Math.PI/180;} 

distHaversine = function(p1, p2) { 
    var R = 6371; // earth's mean radius in km 
    var dLat = rad(p2.lat() - p1.lat()); 
    var dLong = rad(p2.lng() - p1.lng()); 

    var a = Math.sin(dLat/2) * Math.sin(dLat/2) + 
      Math.cos(rad(p1.lat())) * Math.cos(rad(p2.lat())) * Math.sin(dLong/2) * Math.sin(dLong/2); 
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
    var d = R * c; 

    return d.toFixed(3); 
} 

    var dirn = new google.maps.DirectionsService(); 
    var map; 

    function initialize() { 
    var center = new google.maps.LatLng(53.7877, -2.9832); 
    var myOptions = { 
     zoom:15, 
     mapTypeId: google.maps.MapTypeId.ROADMAP, 
     center: center 
    } 
    map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); 

    google.maps.event.addListener(map, "click", function(event) { 
     // == When the user clicks on a the map, get directiobns from that point to itself == 
     var request = { 
      origin: event.latLng, 
      destination: event.latLng, 
      travelMode: google.maps.DirectionsTravelMode.DRIVING 
     }; 
     dirn.route(request, function(response, status) { 
      if (status == google.maps.DirectionsStatus.OK) { 
       if(response.routes && response.routes.length > 0){ 
        route = response.routes[0]; 
        if(route.overview_path && route.overview_path.length > 0){ 
         pos = route.overview_path[0]; 
         new google.maps.Marker({ 
           position: pos, 
           map: map 
         }); 
         alert(distHaversine(request.origin, pos)); 
        } 
       } 
      } 
     }); 
    }); 
    } 




</script> 
</head> 
<body onload="initialize()"> 
<div id="map_canvas"></div> 
</body> 
</html> 

Tôi hy vọng điều này hữu ích.

+0

Tôi cho rằng điều này có thể được sử dụng để xác định xem một điểm có nằm ngoài đường không. Tôi đã nhập một tấn điểm gps từ OpenStreetMap chỉ là những con đường của một phần tôi đã chỉ định, nhưng tôi biết việc kiểm tra một điểm đối với toàn bộ bộ sưu tập sẽ không phải là cách tốt nhất. – Stevus

2

Nơi tốt nhất để hỏi là https://gis.stackexchange.com/. Không thể tìm ra vị trí đường từ lớp chứa đường? Bạn sẽ được cung cấp tất cả các nút đường trong thời gian dài. Trừ khi đó là một đường cong, bạn có thể tìm thấy nếu điểm dài của bạn lies on the road line. Để chuyển đổi lat-long to cartesian, hãy làm theo liên kết.

+0

Tôi đã làm một cái gì đó tương tự như thế này, nhưng nó là để xác định phần đường gần nhất cho một điểm GPS. Tôi đang cố gắng xác định một cách để biết liệu một chiếc xe đã bị lệch khỏi đường và sẽ có ảnh hưởng đến tòa nhà/cảnh quan/địa hình gồ ghề hay không. – Stevus

+0

AFAIK, cách duy nhất để tìm ra điều đó là có một lớp nơi các tòa nhà được đánh dấu là tòa nhà (hoặc các vec-tơ bị chặn tương tự). Đối với địa hình, bản đồ cung cấp các vec-tơ bị ràng buộc mô tả đường nét và nhiều địa hình khác. Nếu bạn có thể thuê ngoài công việc của mình, bạn cũng có thể tạo một lớp để tạo thủ công một lớp và đánh dấu tất cả các tòa nhà trong đó, sử dụng AutoCAD (đó là cách tạo bản đồ) HOẶC mua bản đồ hoặc lớp từ những nguồn đã đánh dấu tòa nhà. – Nav

+0

Bất kỳ ý tưởng nào để tải xuống/mua bộ dữ liệu bản đồ GPS? Tôi sử dụng OpenStreetMap rất nhiều, nhưng tôi tò mò muốn biết Google đang tạo ra các khung nhìn bản đồ của nó như thế nào. Họ phải lấy dữ liệu từ đâu đó tương tự. – Stevus

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