【问题标题】:set leaflet.js map to display current location设置 Leaflet.js 地图以显示当前位置
【发布时间】:2019-10-18 10:39:20
【问题描述】:

我正在使用流星的 leaflet.js 包,但在初始渲染时无法将地图默认设置为我当前的位置。 setView 方法适用于硬数字,但它不喜欢我的变量。我对 js 很陌生,所以错误可能很明显。这是我所拥有的:

 Template.map.rendered = function() {
 L.Icon.Default.imagePath = 'packages/bevanhunt_leaflet/images';

 if (navigator.geolocation) {
  navigator.geolocation.getCurrentPosition(function(position) {
    console.log('--- Your Position: ---');
    console.log('Lat: ' + position.coords.latitude);
    latit = position.coords.latitude;
    console.log('Long: ' + position.coords.longitude);
    longit = position.coords.longitude;
    console.log('---------------------');
    var abc = L.marker([position.coords.latitude, position.coords.longitude]).addTo(map);
} 
)}

map = L.map('map', {
  doubleClickZoom: false
}).setView([latit, longit], 13);

我不断收到的错误是

Uncaught TypeError: Cannot read property 'addLayer' of undefined
L.Marker.L.Class.extend.addTo @ leaflet-src.js:3511
(anonymous function) @ client.js?ea76789cca0ff64d5985320ec2127d5de1fb802f:28

当我使用 console.log(latit) 或 console.log(longit) 时,它会返回数字,以及后面的“未定义”。提前感谢任何可以提供帮助的人!

编辑:

初始渲染时的确切控制台输出:

Exception from Tracker afterFlush function:
debug.js:41 ReferenceError: latit is not defined
    at Template.map.rendered (client.js?    ea76789cca0ff64d5985320ec2127d5de1fb802f:36)
    at template.js:116
    at Function.Template._withTemplateInstanceFunc (template.js:437)
    at fireCallbacks (template.js:112)
    at null.<anonymous> (template.js:205)
    at view.js:104
    at Object.Blaze._withCurrentView (view.js:523)
    at view.js:103
at Object.Tracker._runFlush (tracker.js:468)
at onGlobalMessage (setimmediate.js:102)
client.js?ea76789cca0ff64d5985320ec2127d5de1fb802f:22 --- Your Position: ---
client.js?ea76789cca0ff64d5985320ec2127d5de1fb802f:23 Lat: 41.0525926
client.js?ea76789cca0ff64d5985320ec2127d5de1fb802f:25 Long: -73.5398427
client.js?ea76789cca0ff64d5985320ec2127d5de1fb802f:27 ---------------------
leaflet-src.js:3511 Uncaught TypeError: Cannot read property 'addLayer' of     undefinedL.Marker.L.Class.extend.addTo @ leaflet-src.js:3511(anonymous function)     @ client.js?ea76789cca0ff64d5985320ec2127d5de1fb802f:28

编辑 2: 我想保持简单,但这是我的完整 js:

var map;
var latit;
var longit;

// on startup run resizing event
Meteor.startup(function() {
$(window).resize(function() {
$('#map').css('height', window.innerHeight - 82 - 45);
});
$(window).resize(); // trigger resize event 
});

// create marker collection
var Markers = new Meteor.Collection('markers');

Meteor.subscribe('markers');

 Template.map.rendered = function() {
 L.Icon.Default.imagePath = 'packages/bevanhunt_leaflet/images';

 if (navigator.geolocation) {
  navigator.geolocation.getCurrentPosition(function(position) {
    console.log('--- Your Position: ---');
    console.log('Lat: ' + position.coords.latitude);
    latit = position.coords.latitude;
    console.log('Long: ' + position.coords.longitude);
    longit = position.coords.longitude;
    console.log('---------------------');
    var abc = L.marker([position.coords.latitude, position.coords.longitude]).addTo(map);
} 
)}

map = L.map('map', {
  doubleClickZoom: false
}).setView([latit, longit], 13); //Error is somewhere before here!!

L.tileLayer.provider('Thunderforest.Outdoors').addTo(map);


map.on('dblclick', function(event) {
 Markers.insert({latlng: event.latlng});
});

//add markers
var query = Markers.find();
query.observe({
added: function (document) {
  var marker = L.marker(document.latlng).addTo(map)
    .on('click', function(event) {
      map.removeLayer(marker);
      Markers.remove({_id: document._id});
    });
},
//remove markers
removed: function (oldDocument) {
  layers = map._layers;
  var key, val;
  for (key in layers) {
    val = layers[key];
    if (val._latlng) {
      if (val._latlng.lat === oldDocument.latlng.lat && val._latlng.lng === oldDocument.latlng.lng) {
        map.removeLayer(val);
      }
    }
  }
}
});
};

【问题讨论】:

  • 能否给出控制台的准确输出?
  • @Sosdoc 编辑了 OP
  • 你在哪里声明latitlongit? (你在某处说var latit 吗?)
  • @Stevec 我们错过了大局,但看起来您的rendered 回调无法访问地图,因为latitlongit 第一次未定义,请执行你有没有初始化它们?在L.map 调用之前的console.log() 会有所帮助
  • @sfletche 我确实说 var latit;和 var longit;在我的 js 顶部,在任何功能之前

标签: javascript meteor undefined leaflet


【解决方案1】:

谢谢,@sosdoc,初始化这些变量确实有帮助,并且会在我的项目的长期帮助我。但是为了简单地在我当前的位置渲染地图,我找到了一个更简单的答案!传单有一个内置的定位方法。我没有传递“未初始化”的纬度和经度变量,而是这样做了:

map = L.map('map', {doubleClickZoom: false}).locate({setView: true, maxZoom: 16});

将地图设置为您的位置。 maxzoom 只是您可以缩放的次数的变量,并且可以更改。

【讨论】:

  • 赞成,因为它是您特定问题的适当答案(不敢相信我忘记了这一点),无论如何,如果您切换地图引擎,您到目前为止使用的过程将很有用(即使用 google maps api、openlayers 等)。
【解决方案2】:

从完整代码可以看出错误就在这里

map = L.map('map', {
  doubleClickZoom: false
}).setView([latit, longit], 13); 

因为 latitlongit 没有设置(在 JS 中,除非你给它们任何值,否则它们是未定义的)。

您可能会感到困惑,因为此代码在您定义的任何回调之前执行:Template.map.rendered 在此脚本终止后执行。

解决方案是为这些参数设置一个初始值

var latit = 0;
var longit = 0;

您的地图最初将以非洲西部为中心。

然后,当执行map.rendered 时,您需要将地图重新​​定位到更新的纬度和经度变量(更新它们不会更新地图)。

if (navigator.geolocation) {
  navigator.geolocation.getCurrentPosition(function(position) {
    latit = position.coords.latitude;
    longit = position.coords.longitude;
    // this is just a marker placed in that position
    var abc = L.marker([position.coords.latitude, position.coords.longitude]).addTo(map);
    // move the map to have the location in its center
    map.panTo(new L.LatLng(latit, longit));
} 

如果你愿意,你也可以将标记的位置传递给panTo()函数:

map.panTo(abc.getLatLng());

最后,请记住,每当您将 function() 传递给某个其他函数时,该函数将在稍后执行以响应某些事件,这在 JavaScript 中已广泛完成。

【讨论】:

    【解决方案3】:

    navigator.geolocation.getCurrentPosition(function(location) {
      var latlng = new L.LatLng(location.coords.latitude, location.coords.longitude);
       alert(latlng);
      var mymap = L.map('mapid').setView(latlng, 13)
      L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token={accessToken}', {
        attribution: 'Map data &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, <a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, Imagery © <a href="https://mapbox.com">Mapbox</a>',
        maxZoom: 18,
        id: 'mapbox.streets',
        accessToken: 'pk.eyJ1IjoiYmJyb29rMTU0IiwiYSI6ImNpcXN3dnJrdDAwMGNmd250bjhvZXpnbWsifQ.Nf9Zkfchos577IanoKMoYQ'
      }).addTo(mymap);
    
      var marker = L.marker(latlng).addTo(mymap);
    });
    #mapid { 
      height: 500px;
    }
    <script src="https://d3js.org/d3.v3.min.js"></script>
    <script src="https://d3js.org/topojson.v0.min.js"></script>
    	<link rel="stylesheet" href="https://npmcdn.com/leaflet@1.0.0-rc.2/dist/leaflet.css" />
    	 <script src="https://npmcdn.com/leaflet@1.0.0-rc.2/dist/leaflet.js"></script>
    
    <div id="mapid"></div>

    //更多传单教程可参考

    【讨论】:

      猜你喜欢
      • 2015-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多