2017-07-10 18 views
0

都市のフィールド、住所、GPSの座標フィールドを持つGoogleマップがあります。入力した住所からGPS座標を見つけたり、表示したりしたいと思います。マップ上のマーカーを移動して、フィールドにデータを表示したいと考えています。 ジオコーディングとジオコーディングが逆転しましたが、指定されたアドレスに配置することができません。マップの別の領域をクリックしてマーカーを移動することはできません。 十分明確ですか?手伝って頂けますか ?ここに私のコードは次のとおりです。住所または都市に基づくGPS座標の検索/表示

<!DOCTYPE html> 
 
<html> 
 
<head> 
 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
 
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> 
 
    <link rel="stylesheet" type="text/css" href="__CSS__/main.css"> 
 
    <style type="text/css"> 
 
     .content{width:600px; height: 350px;margin: 10px auto;} 
 
     .content table{width: 100%} 
 
     .content table td{vertical-align: middle;} 
 
     #city,#address{height:21px;background: #FFF;border:1px solid #d7d7d7; line-height: 21px;} 
 
     #city{width:60px} 
 
     #address{width:130px} 
 
     #is_dynamic_label span{vertical-align:middle;margin: 3px 0px 3px 3px;} 
 
     #is_dynamic_label input{vertical-align:middle;margin: 3px 3px 3px 50px;} 
 
    </style> 
 
    <!--<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=021c8fdab28e1941b3649ff34d23cd05"></script>--> 
 

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

 
    </script> 
 

 

 
    <script type="text/javascript" src="__JS__/jquery.js"></script> 
 
    <title>Affichage de la carte</title> 
 
</head> 
 
<body> 
 

 

 

 

 

 
<div class="content"> 
 
    <table> 
 
     <tr> 
 
      <td width="130"><var id="lang_city"></var>Ville:<input id="city" type="text" /></td> 
 
      <td width="190"><var id="lang_address"></var>Adresse:<input id="address" type="text" value="" /></td> 
 
      <td><input id ="submit" class="formInput01" type="button" value="Ok"></a></td> 
 
     </tr> 
 
     <tr> 
 
      <td>Latitude:<a id="lat"></a></td> 
 
      <td>Longitude:<a id="lng"></a></td> 
 
      <td>Lieu actuelle:<a id="_address"></a></td> 
 
     </tr> 
 
    </table> 
 
    <input type="hidden" value="{$_GET['id']}" name="id" id="id"> 
 
    <div style="width:100%;height:340px;margin:5px auto;border:1px solid gray" id="container"></div> 
 

 
    <script> 
 
    /* Déclaration des variables */ 
 
     var geocoder; 
 
     var map; 
 
     var marker = null; 
 
     var elevator; 
 

 

 

 
     function initMap() { 
 
      var latlng = new google.maps.LatLng(48.866667, 2.333333); // Paris 
 
      var map = new google.maps.Map(document.getElementById('container'), { 
 
       zoom: 8, 
 
       center: latlng, 
 
       mapTypeId: google.maps.MapTypeId.ROADMAP 
 
      }); 
 
      
 
      var marker = new google.maps.Marker({ 
 
       map: map, 
 
       position: latlng 
 
      }); 
 
      
 
      var geocoder = new google.maps.Geocoder(); 
 
      var infowindow = new google.maps.InfoWindow(); 
 
      
 
      document.getElementById('submit').addEventListener('click', function() { 
 
      geocodeAddress(geocoder, map); 
 
      }); 
 

 
     } 
 
     
 
     function geocodeAddress(geocoder, resultsMap) { 
 
     var address = document.getElementById('address').value; 
 
     geocoder.geocode({'address': address}, function(results, status) { 
 
      if (status === 'OK') { 
 
      resultsMap.setCenter(results[0].geometry.location); 
 
      var marker = new google.maps.Marker({ 
 
       map: resultsMap, 
 
       position: results[0].geometry.location 
 
      }); 
 
      } else { 
 
      alert("Le geocodage n\'a pu etre effectue pour la raison suivante: " + status); 
 
      } 
 
     }); 
 
     } 
 
     
 
     
 
     function geocodeLatLng(geocoder, map, infowindow) { 
 
     var input = document.getElementById('latlng').value; 
 
     var latlngStr = input.split(',', 2); 
 
     var latlng = {lat: parseFloat(latlngStr[0]), lng: parseFloat(latlngStr[1])}; 
 
     geocoder.geocode({'location': latlng}, function(results, status) { 
 
      if (status === 'OK') { 
 
      if (results[1]) { 
 
       map.setZoom(11); 
 
       var marker = new google.maps.Marker({ 
 
       position: latlng, 
 
       map: map 
 
       }); 
 
       infowindow.setContent(results[1].formatted_address); 
 
       infowindow.open(map, marker); 
 
      } else { 
 
       window.alert('No results found'); 
 
      } 
 
      } else { 
 
      window.alert('Geocoder failed due to: ' + status); 
 
      } 
 
     }); 
 
     } 
 
    </script> 
 

 

 
</div> 
 

 

 
<!-- 
 
<script type="text/javascript"> 
 
    var map = new BMap.Map("container"),marker,point,styleStr, 
 
     lat = document.getElementById('lat'), 
 
     lng = document.getElementById('lng'), 
 
     _address = document.getElementById('_address'), 
 
     id = document.getElementById('id'); 
 
    var api = frameElement.api, W = api.opener, 
 
     _lat = W.document.getElementById('lat'), 
 
     _lng = W.document.getElementById('lng'), 
 
     p_address = W.document.getElementById('address'); 
 
    map.enableScrollWheelZoom(); 
 
    map.enableContinuousZoom(); 
 
    function doSearch(){ 
 
     if (!document.getElementById('city').value) { 
 
      alert('Vous n\'avez pas entré la ville!'); 
 
      return; 
 
     } 
 
     var search = new BMap.LocalSearch(document.getElementById('city').value, { 
 
      onSearchComplete: function (results){ 
 
       if (results && results.getNumPois()) { 
 
        var points = []; 
 
        for (var i=0; i<results.getCurrentNumPois(); i++) { 
 
         points.push(results.getPoi(i).point); 
 
        } 
 
        if (points.length > 1) { 
 
         map.setViewport(points); 
 
        } else { 
 
         map.centerAndZoom(points[0], 13); 
 
        } 
 
        point = map.getCenter(); 
 
       } else { 
 
        alert(lang.errorMsg); 
 
       } 
 
      } 
 
     }); 
 
     search.search(document.getElementById('address').value || document.getElementById('city').value); 
 
    } 
 

 
    function init(e){ 
 
     var geolocation = new BMap.Geolocation(); 
 
     map.centerAndZoom(new BMap.Point(116.404, 39.915), 11); // 初始化地图,设置中心点坐标和地图级别 
 
     map.addControl(new BMap.MapTypeControl()); //添加地图类型控件 
 
     map.setCurrentCity("Paris"); // capital de France 
 
     if(_lat.value && _lng.value){ 
 
      lat.innerHTML = _lat.value; 
 
      lng.innerHTML = _lng.value; 
 
      // 
 
      var point = new BMap.Point(_lng.value,_lat.value); 
 
      map.centerAndZoom(point, 18); 
 
      var geoc = new BMap.Geocoder(); 
 
       geoc.getLocation(point, function(rs){ 
 
        var addComp = rs.addressComponents; 
 
        _address.innerHTML =(addComp.province+ addComp.city+ addComp.district + addComp.street + addComp.streetNumber); 
 
       }); 
 

 
      var marker = new BMap.Marker(point);// 创建标注 
 
      map.addOverlay(marker);    // 将标注添加到地图中 
 
     }else{ 
 
      geolocation.getCurrentPosition(function(r){ 
 
       if(this.getStatus() == BMAP_STATUS_SUCCESS){ 
 
        var mk = new BMap.Marker(r.point); 
 
        map.addOverlay(mk); 
 
        map.panTo(r.point); 
 
        map.centerAndZoom(new BMap.Point(r.point.lng, r.point.lat), 18); // 初始化地图,设置中心点坐标和地图级别 
 
        map.addControl(new BMap.MapTypeControl()); //添加地图类型控件 
 
        map.setCurrentCity(r.address.city); 
 
       } 
 
       else { 
 
        map.centerAndZoom(new BMap.Point(116.404, 39.915), 11); // 初始化地图,设置中心点坐标和地图级别 
 
        map.addControl(new BMap.MapTypeControl()); //添加地图类型控件 
 
        map.setCurrentCity("paris"); // capital de France 
 
       } 
 
      },{enableHighAccuracy: true}); 
 
     } 
 

 

 

 
     var geoc = new BMap.Geocoder(); 
 

 
     map.addEventListener("click", function(e){ 
 
      map.clearOverlays(); 
 
      var pt = e.point; 
 
      geoc.getLocation(pt, function(rs){ 
 
       var point = new BMap.Point(rs.point.lng,rs.point.lat); 
 
       map.centerAndZoom(point, 18); 
 
       var marker = new BMap.Marker(point);// 创建标注 
 
       map.addOverlay(marker);    // 将标注添加到地图中 
 
       lat.innerHTML = rs.point.lat; 
 
       lng.innerHTML = rs.point.lng; 
 
       _address.innerHTML = rs.address; 
 
      }); 
 
     }); 
 
    } 
 

 

 
    init(); 
 
    document.getElementById('address').onkeydown = function (evt){ 
 
     evt = evt || event; 
 
     if (evt.keyCode == 13) { 
 
      doSearch(); 
 
     } 
 
    }; 
 
    api.button({ 
 
     id:'ok', 
 
     name:'Ok', 
 
     callback:function(){ 
 
      if(!lat.innerHTML && !lng.innerHTML){ 
 
       alert('Veuillez confirmer l\'adresse actuelle!'); 
 
       return false; 
 
      } 
 
      W.document.getElementById('lat').value = lat.innerHTML; 
 
      W.document.getElementById('lng').value = lng.innerHTML; 
 
     } 
 
    }); 
 

 
</script> 
 

 
---> 
 

 

 
</body> 
 
</body> 
 
</html>

答えて

0

これはセキュリティで保護されていないとして、公の場で自分のAPIキーを投稿はご遠慮ください。第三者があなたのクォータを使い切る可能性があります。セキュリティのために、サンプルコードからAPIキーを編集することをおすすめします。

私はあなたの説明からあなたがしようとしていることを理解していると信じており、私はそれを達成したと信じています。

最初に、私はマーカーのドラッグ可能をtrueに設定していないことに気付きました。そのため、マーカーをドラッグできません。

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

あなたはGPSが入力されたアドレスまたはVISその逆座標から表示できるようにユーザーを望む述べました。このために、私はGPSのために余分な入力フィールドを追加した座標:

<td width="190"><var id="lang_gps"></var>GPS:<input id="gps" type="text" value="" /></td> 

ユーザーがGPS座標またはアドレスのどちらか入力できるようにしたい場合はアプリがそれかどうかを知っているように、あなたはロジックを追加する必要があります順方向または逆方向ジオコーディングです。これを行うために、GPS座標入力と住所入力にクリックリスナーを追加しました。ユーザーがGPSテキストボックスをクリックすると、アドレステキストボックスはクリアされます。アドレステキストボックスにユーザーがクリックした場合、GPSは、テキストボックスがクリアされている座標:

document.getElementById("address").addEventListener("click", function(){ 
      document.getElementById("gps").value = ""; 
     }); 
document.getElementById("gps").addEventListener("click", function(){ 
      document.getElementById("address").value = ""; 
     }); 

ユーザーがジオコードするOKボタンをクリックすると、アドレステキストボックスやGPSテキストボックスは、値を持っているかどうかのアプリのチェックが前方ありませんかどのテキストボックスに値があるかに応じて逆ジオコーディング。

さらに2つのアクションリスナーを追加する必要もありました。 1つはマーカーがドラッグされたとき、もう1つはマーカーのドラッグが終了したときのものです。これらは、現在のアドレスとlat、lngがどこにあるかを示すフィールドを埋めます。

 google.maps.event.addListener(marker,'drag',function(event) { 
      document.getElementById('lat').innerHTML = event.latLng.lat(); 
      document.getElementById('lng').innerHTML = event.latLng.lng(); 



     }); 

     google.maps.event.addListener(marker,'dragend',function(event) { 
      document.getElementById('lat').innerHTML =event.latLng.lat(); 
      document.getElementById('lng').innerHTML =event.latLng.lng(); 
      geocoder.geocode({'location': marker.getPosition()}, function(results, status) { 
       if (status === 'OK') { 
       document.getElementById('_address').innerHTML = results[0].formatted_address; 
       for(i = 0; i<results[0].address_components.length; i++){ 
       if(results[0].address_components[i].types[0] === "locality"){ 
        document.getElementById('city').value = results[0].address_components[i].long_name; 
       } 
       } 
       } else { 
       window.alert('Geocoder failed due to: ' + status); 
       } 
      }); 
     }); 

現在、ユーザーはアドレスまたはgps座標を入力し、[OK]ボタンをクリックできます。それが完了すると、Villeフィールド、緯度フィールド、経度フィールド、およびLieu actuelleが更新されます。 Villeは都市を示し、緯度は経度を示し、経度は経度を示し、Lieu actuelleは現在のマーカー位置の完全なアドレスを示します。ユーザはそれに応じてマーカーをドラッグすることができ、それに応じてVille、Latidue、Longitude、Lieu actuelleフィールドが更新されます。

私はこれをJSFiddleで実演しましたが、これについては後で説明します。あなたが仕事に入力サンプルのための独自のAPIキーを喜ばせるために必要があるでしょう、私はセキュリティのための私のAPIキーを編集されていることに注意してください:

https://jsfiddle.net/4cd0hsxk/1/

私はこれが役に立てば幸い!

関連する問題