The problem
The problem was found with Vue2Leaflet: v0.0.55.
Map appears as a large gray box with a small section with rendered map tiles, the leaflet css import was included.
This is an example of the broken map:
If you didn't include CSS stylesheet as mentioned in the readme, please verify that before continue with the solution. With window resize, the map loads as it should andthe marker does not show up.
The template used is the following:
<template>
<div class="simple">
<div id="top_div" style="height: 100%">
<v-map :zoom="zoom" :center="center" style="height: 1000px; width: 1000px">
<v-tilelayer :url="url" :attribution="attribution"></v-tilelayer>
<v-marker :lat-lng="marker"></v-marker>
</v-map>
</div>
</div>
</template>
<script>
import Vue2Leaflet from 'vue2-leaflet';
export default {
name: 'simple',
components: {
'v-map': Vue2Leaflet.Map,
'v-tilelayer' :Vue2Leaflet.TileLayer,
'v-marker': Vue2Leaflet.Marker
},
data () {
return {
zoom: 13,
center: [47.413220, -1.219482],
url: 'http://{s}.tile.osm.org/{z}/{x}/{y}.png',
attribution: '© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors',
marker: L.latLng(47.413220, -1.219482),
}
}
}
</script>
<style>
@import "~leaflet/dist/leaflet.css";
</style>
Solution
This could be webpack, which is jacking up the embedded image URLs in the CSS. Throwing this at the top of your main.js
may help:
import L from 'leaflet';
delete L.Icon.Default.prototype._getIconUrl;
L.Icon.Default.mergeOptions({
iconRetinaUrl: require('leaflet/dist/images/marker-icon-2x.png'),
iconUrl: require('leaflet/dist/images/marker-icon.png'),
shadowUrl: require('leaflet/dist/images/marker-shadow.png')
});
You can also try to resize using javascript:
mounted() {
setTimeout(function() { window.dispatchEvent(new Event('resize')) }, 250);
}