【问题标题】:marker should point to location and if user drags the marker the location should be in textbox标记应指向位置,如果用户拖动标记,则位置应在文本框中
【发布时间】:2016-01-08 20:27:29
【问题描述】:

我是谷歌地图的新手。我浏览了很多帖子,但没有找到我想要的。我想实现这个:improve-my-city

但我只能获取用户位置和拖动标记。我希望标记移动到在按钮单击时在地图上输入的位置,反之亦然,当用户拖动标记时,地址应该在文本框中。我的信息窗口也没有显示。

当我使用 Asp.net 时,我的 html 页面有所不同,我的地图显示在 asp 页面上的 iframe 中。文本框和按钮在 .aspx 页面中

<div id="map"></div>
<script>

    function initMap() {
        if (navigator.geolocation) {
            navigator.geolocation.getCurrentPosition(showPosition,  showError);
        } else {
            x.innerHTML = "Geolocation is not supported by this browser.";
        }

        function showError(error) {
            switch (error.code) {
                case error.PERMISSION_DENIED:
                    x.innerHTML = "User denied the request for Geolocation."
                    break;
                case error.POSITION_UNAVAILABLE:
                    x.innerHTML = "Location information is unavailable."
                    break;
                case error.TIMEOUT:
                    x.innerHTML = "The request to get user location timed  out."
                    break;
                case error.UNKNOWN_ERROR:
                    x.innerHTML = "An unknown error occurred."
                    break;
            }
        }
        updateMarkerPosition(latlon);
         geocodePosition(latlon);
    }

    function showPosition(position) {
        lat = position.coords.latitude;
        lon = position.coords.longitude;
        latlon = new google.maps.LatLng(lat, lon)
        mapholder = document.getElementById('map')

        var myOptions = {
            center: latlon,
            zoom: 14,
            mapTypeId: google.maps.MapTypeId.ROADMAP,
            mapTypeControl: false,
            navigationControlOptions:
            { style: google.maps.NavigationControlStyle.SMALL }
        }

        var contentString = 'Drag red marker <br/> to improve geo-location';
        var infowindow = new google.maps.InfoWindow({
            content: contentString
        });
        infowindow.open(map, marker);

        var map = new google.maps.Map(document.getElementById("map"), myOptions);
        var marker = new google.maps.Marker({
            position: latlon,
            map: map,
            title: 'Report refers to this location',
            draggable: true
        });



        // Add dragging event listeners.
        google.maps.event.addListener(marker, 'dragstart', function () {
            updateMarkerAddress('Dragging...');
        });

        google.maps.event.addListener(marker, 'drag', function () {
            updateMarkerStatus('Dragging...');
            updateMarkerPosition(marker.getPosition());
        });

        google.maps.event.addListener(marker, 'dragend', function () {
            updateMarkerStatus('Drag ended');
            geocodePosition(marker.getPosition());
        });


    }


</script>
<script src="https://maps.googleapis.com/maps/api/js?callback=initMap"
        async defer>
</script>

【问题讨论】:

  • 嗨@Ashwini ..你在什么时候得到..你想达到的第一个目标是什么?
  • 嗨 scais。我希望将标记指向的位置传递到文本框
  • 我正在使用您的代码,但是当我尝试拖动标记时,控制台出现错误.. updateMarkerStatus 未定义...请告诉我.. 这是您想要实现的吗?跨度>
  • 这个晚上可以帮助你一次又一次..你必须耐心
  • 我也遇到了同样的错误。我不知道该怎么办。慢慢来,我会等的。 :)

标签: html asp.net google-maps


【解决方案1】:

此示例显示拖动结束时标记的位置地址。

这应该足以理解反向地理编码是如何工作的(从一个点的坐标中获取地址)

 <script type="text/javascript">
    var geocoder;

    function initMap() {
        geocoder = new google.maps.Geocoder();
        if (navigator.geolocation) {
            navigator.geolocation.getCurrentPosition(showPosition,  showError);
        } else {
            x=document.getElementById("msg");
            x.innerHTML = "Geolocation is not supported by this browser.";
        }

        function showError(error) {
            x=document.getElementById("msg");
            switch (error.code) {
                case error.PERMISSION_DENIED:
                    x.innerHTML = "User denied the request for Geolocation."
                    break;
                case error.POSITION_UNAVAILABLE:
                    x.innerHTML = "Location information is unavailable."
                    break;
                case error.TIMEOUT:
                    x.innerHTML = "The request to get user location timed  out."
                    break;
                case error.UNKNOWN_ERROR:
                    x.innerHTML = "An unknown error occurred."
                    break;
            }
        }



        //updateMarkerPosition(latlon);
        //geocodePosition(latlon);
    }

     function geocodePosition(pos) {
        x=document.getElementById("msg");
        geocoder.geocode({'latLng': pos}, function(results, status) {
          if (status == google.maps.GeocoderStatus.OK) {
            if (results[0]) {
               x.innerHTML = results[0].formatted_address;
              }
          } else {
            x.innerHTML = "Geocoder non possibile";
          }  
        });

    }

    function showPosition(position) {
        lat = position.coords.latitude;
        lon = position.coords.longitude;
        latlon = new google.maps.LatLng(lat, lon)
        mapholder = document.getElementById('map')

        var myOptions = {
            center: latlon,
            zoom: 14,
            mapTypeId: google.maps.MapTypeId.ROADMAP,
            mapTypeControl: false,
            navigationControlOptions:
            { style: google.maps.NavigationControlStyle.SMALL }
        }

        var contentString = 'Drag red marker <br/> to improve geo-location';
        var infowindow = new google.maps.InfoWindow({
            content: contentString
        });
        infowindow.open(map, marker);

        var map = new google.maps.Map(document.getElementById("map"), myOptions);
        var marker = new google.maps.Marker({
            position: latlon,
            map: map,
            title: 'Report refers to this location',
            draggable: true
        });


        // Add dragging event listeners.
        google.maps.event.addListener(marker, 'dragstart', function (evt) {
             x=document.getElementById("msg");
             x.innerHTML = '<p>Dragging ... Marker dropped: Current Lat: ' + evt.latLng.lat() + ' Current Lng: ' + evt.latLng.lng() + '</p>';
        });

        google.maps.event.addListener(marker, 'drag', function (evt) {
             x=document.getElementById("msg");
             x.innerHTML = '<p>Dragging ... again .... Marker position: Current Lat: ' + evt.latLng.lat() + ' Current Lng: ' + evt.latLng.lng() + '</p>';
        });

        google.maps.event.addListener(marker, 'dragend', function (evt) {
            x=document.getElementById("msg");
            x.innerHTML =  '<p>Drag .. ended ... Marker dropped: Current Lat: ' + evt.latLng.lat() + ' Current Lng: ' + evt.latLng.lng() + '</p>';
            geocodePosition(marker.getPosition());
        });

    }


  </script>
  <script src="https://maps.googleapis.com/maps/api/js?callback=initMap"
        async defer>
  </script>

【讨论】:

  • 点击时标记会浮动。当我直接运行 html 页面时,控制台显示错误 updateMarkerAddress 未定义。但它正在另一个页面上工作,即 aspx ...
  • 您必须复制我提供的代码。在其中注释了无用的功能,并在其中添加了 id='msg' 的 div ...并在侦听器中正确添加了消息..
  • 那么现在,当您移动标记时,您会在左上方 div 上看到简短消息,并且控制台中没有错误。下一步我们尝试从拖动结束的点获取坐标并在 div 中显示 .. .我稍后提供代码..
  • 我已经更新了答案……现在代码显示了标记的坐标……动态地……
  • 嗯,我认为第一个问题已经解决,或者你有适应你的代码的元素。正如我所说的一个问题。如果你有问题或者你想更好地理解。评论我。 。 否则 。评价为已接受并且评价为有用.. 在下一个问题中,我们可以看到如何继续实现您的目标
猜你喜欢
  • 2017-09-28
  • 2019-05-19
  • 1970-01-01
  • 1970-01-01
  • 2012-09-28
  • 2018-06-01
  • 2019-07-26
  • 2021-04-18
  • 2011-04-27
相关资源
最近更新 更多