【问题标题】:Using leaflet-d3 on svelte在 svelte 上使用 Leaflet-d3
【发布时间】:2020-08-24 08:34:40
【问题描述】:

我必须在 svelte 上使用 Leaflet-d3 来创建一个 hexmap。我正在使用已经测试过其他东西的代码。可以找到here

function createMap(id, config, zoomFunction) {

let initialView = [config.startLat, config.startLng];
if(!config.startLat || !config.startLng){
  initialView = [0,0]
  config.startZoom = 1;
}
let m = L.map(id, {preferCanvas: true, minZoom: config.minZoom, maxZoom: config.maxZoom }).setView(initialView, config.startZoom);
let layers = {
  'Street map': L.tileLayer.provider('OpenStreetMap.Mapnik',{
    maxZoom: 36
  }),
  'Terrain map': L.tileLayer.provider('Esri.WorldImagery',{
    maxZoom: 36
  }),
  'Google Satellite': L.tileLayer('//{s}.google.com/vt/lyrs=s&x={x}&y={y}&z={z}',{
    maxZoom: 36,
    subdomains:['mt0','mt1','mt2','mt3']
  }),
  'Google Street': L.tileLayer('//{s}.google.com/vt/lyrs=m&x={x}&y={y}&z={z}',{
    maxZoom: 36,
    subdomains:['mt0','mt1','mt2','mt3']
  }),
  'Google Hybrid': L.tileLayer('//{s}.google.com/vt/lyrs=y&x={x}&y={y}&z={z}',{
    maxZoom: 36,
    subdomains:['mt0','mt1','mt2','mt3']
  })
};

if(!config.defaultMap) config.defaultMap = 'Street map';

layers[config.defaultMap].addTo(m);

if(config.showMinimap == true){
  let minimapLayer = new L.tileLayer.provider('OpenStreetMap.Mapnik',{
    maxZoom: 13
  });
  let minimap = new L.Control.MiniMap(minimapLayer, {toggleDisplay: true}).addTo(m);
}

L.control.layers(layers).addTo(m);

if(config.showScale == true){
  let scaleObject = L.control.scale({"metric":true, "imperial":false});
  scaleObject.addTo(m);
}

let hexbinLayer = L.hexbinLayer().addTo(map);




return m;
}

问题出在我使用的时候

let hexbinLayer = L.hexbinLayer().addTo(map);

它说

leafletSrc.hexbinLayer 不是函数

我像这样导入库:

  import * as d3 from 'd3';
  import L from 'leaflet';

在我导入的 index.html 上,使用示例:

<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.16.0/d3.min.js" integrity="sha512-FHsFVKQ/T1KWJDGSbrUhTJyS1ph3eRrxI228ND0EGaEp6v4a/vGwPWd3Dtd/+9cI7ccofZvl/wulICEurHN1pg==" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/d3-hexbin@0.2.2/build/d3-hexbin.min.js" integrity="sha256-ikdJu86qkbPypZwSAqs06fEeiNYpdjwHWxXYbbrCeGY=" crossorigin="anonymous"></script>



<script src="https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.6.0/leaflet.js" integrity="sha512-gZwIG9x3wUXg2hdXF6+rVkLF/0Vi9U8D2Ntg4Ga5I5BZpVkVxlJWbSQtXPSiUTtC0TjtGOmxa1AJPuV0CPthew==" crossorigin="anonymous"></script>

<script src="https://cdn.jsdelivr.net/npm/@asymmetrik/leaflet-d3@4.4.0/dist/leaflet-d3.min.js" integrity="sha256-vbhDr00YfmTSp2F0FT7sIVKE56+ANHBpdW51fs3Zbko=" crossorigin="anonymous"></script>

我认为我有库同步的问题。有什么帮助吗?

------- 编辑

我在控制台上也有这条消息

【问题讨论】:

    标签: d3.js leaflet svelte


    【解决方案1】:

    正如它在本期中所说,您需要以某种方式导入 leaflet-d3,即使它不导出任何内容,因为它会将所有内容添加到 L 对象中。

    我通过在代码开头添加import "@asymmetrik/leaflet-d3"; 来实现这一点。您可能需要告诉 eslint 忽略对该行有副作用的导入,否则,您应该没问题。请记住在导入leaflet-d3之前导入L

      import { onMount } from "svelte";
      // import { createMap } from '../lib/maps/generic';
      // import {replaceNestedValues} from 'cache-store';
    
      import L from "leaflet";
      import "leaflet-providers";
      import "leaflet-minimap";
      import { marker } from "leaflet";
      import * as d3 from "d3";
      import * as d3hexbin from "d3-hexbin";
    
      import "@asymmetrik/leaflet-d3";
    

    现在我得到了地图未定义的错误,但这至少解决了一个问题:)

    【讨论】:

      猜你喜欢
      • 2014-05-05
      • 1970-01-01
      • 2020-01-17
      • 2014-02-08
      • 2021-05-23
      • 2022-01-23
      • 1970-01-01
      • 2022-11-10
      • 1970-01-01
      相关资源
      最近更新 更多