65.9K
CodeProject 正在变化。 阅读更多。
Home

在 Google 地图标记周围绘制圆圈

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.62/5 (6投票s)

2013年5月3日

CPOL

4分钟阅读

viewsIcon

71397

downloadIcon

4005

使用 google map api v3 在标记周围绘制圆圈, 并在标记拖动时移动圆圈



介绍 

Google Maps API 用于将地图嵌入网页。当前最新版本是 3。

V3 为移动应用程序和桌面浏览器应用程序添加了功能。


背景 

在本帖中,我们将介绍

- 如何在 Google 地图中标记周围绘制圆形。

- 移动标记位置时如何更改圆形位置。

- 使用滑块更改圆形的半径(增大/减小尺寸)。  

使用代码

在此示例中,我使用了 Google Map API 版本 3。

 

我们将逐步理解其功能。

创建一个新的 ASP.Net 网页应用程序,并添加 ViewMap.aspx 页面。

步骤 1:在页面中添加文本框以显示地图上选定的纬度和经度。   

 <asp:TextBox ID="txtPointA1" runat="server" ClientIDMode="Static" Enabled="false"
                  Width="170px"></asp:TextBox>
 <asp:TextBox ID="txtPointA2" runat="server" ClientIDMode="Static" Enabled="false"
                  Width="170px"></asp:TextBox> 

创建了 2 个文本框,一个用于纬度,一个用于经度。

当用户将标记从一个位置移动到另一个位置时,这些文本框的值会发生变化。

以下是获取地图当前纬度和经度并将其值设置到文本框中的代码。

 function setLatLongValue() {
 
    jQuery('#txtPointA1').val(currentlatlng.lat());
    jQuery('#txtPointA2').val(currentlatlng.lng());
 
} 

 

步骤 2:在页面中添加滑块以更改圆的半径。 

AjaxControlToolkit 中提供了 SliderExtender。

首先,您必须将 AjaxControlToolkit 添加到项目中。要在页面中使用 AjaxControlToolkit 控件,请在页面顶部的 @Page 指令之后使用 @Register 指令将其添加,如下所示: 

 <%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="ajaxToolkit" %>  

 这将会在您的 aspx 页面中注册 AjaxControlToolkit,现在您可以使用 AjaxControlToolkit.dll 中提供的控件。

现在,使用 TagPrefix 添加 SliderExtender,如下所示。

 

  

<asp:TextBox ID="txtPointB1" runat="server" 
             onchange="drawCircle();" ClientIDMode="Static"></asp:TextBox>
 
<ajaxToolkit:SliderExtender ID="sliderRadius" BehaviorID="sliderRadius" runat="server"
                            TargetControlID="txtPointB1" Minimum="200" Maximum="2000" 
                            BoundControlID="txtRadiusShow"
                            EnableHandleAnimation="true" EnableKeyboard="false" />
                        
<asp:TextBox ID="txtRadiusShow" runat="server" MaxLength="4" CssClass="setmargin"
               ClientIDMode="Static"></asp:TextBox> <span style="font-size: 9pt;"> </span>

 

Slider extender 控件允许用户从有限的范围内选择一个数值。滑块的方向可以是水平的或垂直的,它还可以充当“离散”滑块,允许在其范围内只取指定数量的值。

添加了 SliderExtender 控件以及 2 个文本框,一个用于 TargetControlID,一个用于 BoundControlID。

BoundControlID 是一个 TextBox 或 Label 的 ID,它动态显示滑块的值。

TargetControlID 是目标控件。

在 TargetControlID 文本框(txtPointB1)中,当滑块值改变时,会调用 drawCirlce() JavaScript 函数。

此函数在 onchange 事件中被调用。

在页面中添加 Div 标签以加载地图   

 <div id="map" style="height: 500px; width: 900px;" />   

 现在,创建 JScript 页面,其中包含所有必需的 Google 地图函数。

- 加载 Google 地图

- 设置标记,

- 在标记周围绘制圆形

- 点击标记时创建信息窗口。

文件名:GoogleMapV3.js 

步骤 3:  在 GoogleMapV3.js 文件中创建 loadMap 函数   

 

var map;
var circle;
var marker;
var currentlatlng = new google.maps.LatLng(23.06368, 72.53135);
var infowindow;

function loadMap() {

    setLatLongValue();

    var mapOptions = {
        zoom: 16,
        center: currentlatlng,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };

    map = new google.maps.Map(document.getElementById('map'), mapOptions);

    google.maps.event.addDomListener(map, 'click', function (e) {

        currentlatlng = e.latLng;

        if (currentlatlng) {

            map.panTo(currentlatlng);
            setLatLongValue();
            setMarker();
        }
    });

}  

 

声明地图、圆形、标记、当前纬度/经度和信息窗口所需的所有变量。

地图是使用 Google 提供的 google.maps.Map 类创建的。

添加了 mapOption。

- center :保存地图位置坐标。(创建一个 LatLng 对象来保存此位置,通过传递位置的坐标(纬度、经度)进行创建) 

- zoom :指定初始地图缩放级别。

- mapTypeId :指定初始地图类型(ROADMAP、SATELLITE、HYBRID 或 TERRAIN)。

此地图已加载到 aspx 页面中创建的(名为 'map')DIV 中。

 添加了事件监听器以处理地图区域中的单击事件,在该事件处理程序中,您需要为以下功能进行处理:

   - 在点击点上设置标记

   - 需要调用 map.PanTo (currentlanlong),此方法会将地图中心更改为给定的点(纬度、经度)。           

 

步骤 4:创建绘制圆形的函数。 

function drawCircle() {

    if (circle != undefined)
        circle.setMap(null);

    var radius = 200;

    if (jQuery('#txtPointB1').val() != '' && !isNaN(jQuery('#txtPointB1').val()) && parseInt(jQuery('#txtPointB1').val()) > 0) {
        radius = parseInt(jQuery('#txtPointB1').val());
    }
    jQuery('#txtPointB1').val(radius.toString());

    var options = {
        strokeColor: '#800000',
        strokeOpacity: 1.0,
        strokeWeight: 1,
        fillColor: '#C64D45',
        fillOpacity: 0.5,
        map: map,
        center: currentlatlng,
        radius: radius
    };

    circle = new google.maps.Circle(options);
} 

如上代码所示,从文本框(txtPointB1)获取圆形的当前半径值。

要绘制圆形,您需要设置以下属性:

 - clickable :指示此圆形是否处理鼠标事件。默认为 true。

- draggable :用于在地图上拖动此圆形。默认为 false。

- fillColor :用于填充圆形区域的颜色。

- fillOpacity :用于设置 0.0 到 1.0 之间的填充不透明度。

- map :要在其上显示圆形的地图。

- radius :地球表面以米为单位的半径。

- strokeColor ,- strokeOpacity

- strokeWeight :描边的宽度(以像素为单位)。 (圆形周围的边框) 

 现在通过设置以上选项来创建 Circle 类的实例(new google.maps.Circle(options))。

当您从 aspx 页面更改滑块值时,它会更改圆的半径并将其设置到地图上(请参见下图)。

 

步骤 5:创建设置标记的函数  

function setMarker() {

    if (marker != undefined)
        marker.setMap(null);

    marker = new google.maps.Marker({
        position: currentlatlng,
        draggable: true,
        map: map
    });

    if (marker) {
        google.maps.event.addDomListener(marker, "dragend", function () {
            currentlatlng = marker.getPosition();
            setLatLongValue();
            drawCircle();
        });
        drawCircle();
    }
}   

 标记是使用 google.maps.Marker 类创建的,通过设置当前纬度经度位置和 draggable=true。

添加了标记的 dragened 事件监听器,以便在标记位置更改时(或标记从一个点拖动到另一个点时)重绘圆形。

 

步骤 6:创建在标记点击时显示信息窗口的代码  

 google.maps.event.addListener(marker, "click", function () {

        var data = '<div>Current LatLong:</div><div>' + currentlatlng + '</div>';

        infowindow = new google.maps.InfoWindow({
            content: data,
            position: currentlatlng
        });

        infowindow.open(map);
    });  

 如上源文件所示,信息窗口是在标记点击事件中创建的。

InfoWindow 用于在点击标记时渲染文本信息。

 

InfoWindow 具有以下可用选项(属性):

- content :要在 InfoWindow 中显示的内容。这可以是 HTML 元素、纯文本字符串或包含 HTML 的字符串。InfoWindow 的大小将根据内容确定。要为内容设置显式大小,请将 content 设置为具有该大小的 HTML 元素。

- position :要显示此 InfoWindow 的 LatLng。如果 InfoWindow 是使用锚点打开的,则将使用锚点的位置。

步骤 7:在页面头部添加 googleapi JavaScript 文件和 GoogleMapV3.js 文件以加载 Google 地图。

  <script language="javascript" src="Scripts/jquery-1.4.1.min.js" 
                type="text/javascript"></script>
  <script src="https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false" 
                type="text/javascript"></script>
 <script src="Scripts/GoogleMapV3.js" type="text/javascript"></script> 

请不要忘记在页面中放置 googleapi JavaScript 源,否则 Google 地图将无法工作。

步骤 8:最后,从页面中调用 window 加载事件上的 loadMap 函数。  

<script type="text/javascript" language="javascript">

        $(window).load(function () {
            loadMap();          
        });

    </script> 

 当窗口加载且地图即将加载到 div 区域时,将调用 loadMap 函数。


© . All rights reserved.