使用jQuery在谷歌地图上的两点之间画一条线?

Posted

技术标签:

【中文标题】使用jQuery在谷歌地图上的两点之间画一条线?【英文标题】:Draw a line between two point on a Google map using jQuery? 【发布时间】:2012-11-06 04:26:53 【问题描述】:

如何使用 jQuery 或 javascript 使用 Google 地图 API 在两点(纬度和经度)之间画一条线?我需要两点之间的最短路径。它可以是任何类型的线。

【问题讨论】:

你想要一条“直线”还是顺着道路? 【参考方案1】:

这是一种绘制线条的 API v3 方法。

var line = new google.maps.Polyline(
    path: [
        new google.maps.LatLng(37.4419, -122.1419), 
        new google.maps.LatLng(37.4519, -122.1519)
    ],
    strokeColor: "#FF0000",
    strokeOpacity: 1.0,
    strokeWeight: 10,
    map: map
);

这只是在两点之间画一条直线。如果您希望它是最短路径,则需要考虑地球是弯曲的这一事实,并绘制一条测地线。为此,您必须通过添加此可选 libraries 参数来使用 Google Maps API 中的 geometry 库:

<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?libraries=geometry"></script>

然后只需将geodesic: true 添加到您的折线选项中:

var line = new google.maps.Polyline(
    path: [new google.maps.LatLng(37.4419, -122.1419), new google.maps.LatLng(37.4519, -122.1519)],
    strokeColor: "#FF0000",
    strokeOpacity: 1.0,
    strokeWeight: 10,
    geodesic: true,
    map: map
);

【讨论】:

查看此链接:***.com/questions/17377058/… 指向文档的链接将是黄金。【参考方案2】:

仅适用于 API v2!

以下代码 sn-p 在两点之间创建一条 10 像素宽的红色折线:

var polyline = new GPolyline([
  new GLatLng(37.4419, -122.1419),
  new GLatLng(37.4519, -122.1519)],
  "#ff0000", 10);
map.addOverlay(polyline);

您可以找到文档here

【讨论】:

这适用于 API v2,该 API v2 已弃用,将于 2013 年 5 月停止工作。强烈建议不要使用它,而改用 API v3。【参考方案3】:

这会在两点之间画一条线……甚至更远。您只需继续在搜索框中输入新地点,它就会继续绘制最近两点之间的点:

SEE WORKING EXAMPLE HERE

HTML:

<div id="inputDiv">
    <input id="startvalue" type="text"  value="" autofocus placeholder="Keep Adding Places and searching...">
</div>
<div id="map"></div>
<div id="results"></div>

JS:

var geocoder;
var map;
var location1;
var location2;

$(document).ready(function()
    initialize();    
    $("#startvalue").on('keydown',function(event)
        if (event.keyCode == 13 ) 
            createLine();
            $(this).val("");
            $(this).focus();
        
    );

)

function initialize()
    geocoder = new google.maps.Geocoder();
    var latlng = new google.maps.LatLng(7.5653, 80.4303);
    var mapOptions = 
        zoom: 4,
        center: latlng,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    
    map = new google.maps.Map(document.getElementById("map"), mapOptions);

    setZoom();

    var input = /** @type htmlInputElement */(
    document.getElementById('startvalue'));

    var searchBox = new google.maps.places.SearchBox(
    /** @type HTMLInputElement */(input));



var address;
var address2;
function createLine()

    if (address)
        address2 = document.getElementById('startvalue').value;     
     else 
        address = document.getElementById('startvalue').value;     
    

    var temp, temp2;

    geocoder.geocode( 'address': address , function (results, status) 
        // if (status != "OK") alert("geocode of address:"+address+" failed, status="+status);
        temp = results[0].geometry.location;
        if (address2)
            geocoder.geocode( 'address': address2 , function (results, status) 
                // if (status != "OK") alert("geocode of address:"+address+" failed, status="+status);
                temp2 = results[0].geometry.location;
                document.getElementById('results').innerHTML += temp2.toUrlValue()+"<br>";

                var route = [
                    temp,
                    temp2
                ];

                var polyline = new google.maps.Polyline(
                    path: route,
                    strokeColor: "#FF5E56",
                    strokeOpacity: 0.6,
                    strokeWeight: 5
                );
                location1 = convertLocationToLatLong(temp.toUrlValue())
                location2 = convertLocationToLatLong(temp2.toUrlValue())



                var lengthInMeters = google.maps.geometry.spherical.computeLength(polyline.getPath());
                document.getElementById('results').innerHTML += "Polyline is "+lengthInMeters+" meters long<br>";

                polyline.setMap(map);
                plotMap(location1,location2);
            );   
            address = address2;          
         else 
            location1 = convertLocationToLatLong(temp.toUrlValue());
            plotMap(location1);
        
    );


function convertLocationToLatLong(location)
    var location = location.split(',').map(function(item) 
        return parseFloat(item);
    );
    return location


function plotMap(location1,location2)
    var location1 = new google.maps.LatLng(location1[0],location1[1]);
    if (location2)
        var location2 = new google.maps.LatLng(location2[0],location2[1]);      
    
    var bounds = new google.maps.LatLngBounds();
    bounds.extend(location1);
    if(location2)
        bounds.extend(location2);    
    
    map.fitBounds(bounds);       
    setZoom();


function setZoom()
    google.maps.event.addListener(map, 'zoom_changed', function() 
    zoomChangeBoundsListener = 
        google.maps.event.addListener(map, 'bounds_changed', function(event) 
            if (this.getZoom() > 15 && this.initialZoom == true) 
                // Change max/min zoom here
                this.setZoom(15);
                this.initialZoom = false;
            
            google.maps.event.removeListener(zoomChangeBoundsListener);
        );
    );
    map.initialZoom = true;

CSS:

#map 
    margin: 0;
    padding: 0;
    height: 400px;
    margin-top:30px;
   width:100%;


#inputDiv
    position:absolute;
    top:0;


#startvalue
  width:300px;
  padding:8px;

【讨论】:

输入应该是什么样的?什么是地方?经纬度点?

以上是关于使用jQuery在谷歌地图上的两点之间画一条线?的主要内容,如果未能解决你的问题,请参考以下文章

需要在网页上的两点之间画一条线

我一直忙于寻找如何在我的应用程序中的地图上的一个(GPS)点和一个标记之间画一条线。有人可以吗?

如何在谷歌地图中找到一条线的中点

Flutter:Google Map Plugin如何在地图内的两个坐标之间画一条线

用 CALayer 画一条线

使用 SceneKit 在两点之间绘制一条线