标签: leaflet

LitElement 中的传单用法

我目前正在开发一个使用 LitElement 组件的应用程序。我想将 Leaflet 集成到其中,但在显示地图时遇到问题。我已经使用 npm 在我的项目中安装了 Leaflet,并创建了一个如下所示的类。

import {LitElement, html, css} from 'lit-element';
import './node_modules/leaflet/dist/leaflet';

class Map extends LitElement{

    static get styles() {
        return [css``];
    }

    constructor() {
        super();
    }
    connectedCallback() {
        super.connectedCallback();
        let map = L.map('mapid').setView([51.505, -0.09], 13);

        let urlTemplate = 'http://{s}.tile.osm.org/{z}/{x}/{y}.png';
        map.addLayer(L.tileLayer(urlTemplate, {minZoom: 4}));
    }

    render() {
        return html`
            <link rel="stylesheet" href="./node_modules/leaflet/dist/leaflet.css">
            <div id="mapid" style="height: 100%"></div>

        `;
    }
}

customElements.define("my-map", Map);
Run Code Online (Sandbox Code Playgroud)

运行我的应用程序会导致以下错误:未捕获类型错误:无法设置未定义的属性“L”。我对如何使用 Leaflet 在 LitElement 应用程序中显示地图有点迷失,并且非常感谢您能推动我走向正确的方向。

javascript leaflet polymer lit-element

2
推荐指数
1
解决办法
900
查看次数

反应传单画布

我试图用传单标记方法绘制大约 50K 点,但由于渲染时间和所需的内存而无法实现。我看到的新方法是使用 Leaflet-canvas 在屏幕上绘制点(而不是在 DOM 中)。我如何在 React leaflet 3.X 中执行此操作。我尝试了 https://www.npmjs.com/package/react-leaflet-canvas-markers 但它不支持传单的V3。

有什么建议吗?

leaflet react-leaflet react-leaflet-v3

2
推荐指数
1
解决办法
3732
查看次数

如何在react-leaflet中使用Typescript设置对'leafletElement'的引用?

问题是,在我的 React 项目中使用 TS 时,我需要设置函数的类型useRef(),但我不知道它是什么。正如下面的代码所示,我将其设置为然后any调用leafletElement。出现的问题是,即使通过whenCreated函数 isnide引用了映射,该元素也始终是未定义的MapContainer

我试图MapContainer以一种显示所有内容的方式进行设置Marker,使其动态调整大小,因此当位置更改时,它会更新它并调整它,MapContainer因为它没有属性ref

我试图重现的示例

const MapTry = () => {
const [nodes, setNodes] = useState<INode[]>([]);
const [devices, setDevices] = useState<IDevice[]>([]);

const [nodeDeviceTest, deviceNodeConnection] = useState([]);
var arrObj: any = [];
var arrOfBounds: any = [];
var mapRef = useRef<any>();
var groupRef = useRef<any>();


var device = new L.Icon({
    iconUrl: deviceCar,
    iconSize: [30, 30],
    iconAnchor: [16, 3],
    popupAnchor: [1, …
Run Code Online (Sandbox Code Playgroud)

leaflet typescript reactjs react-leaflet

2
推荐指数
1
解决办法
3480
查看次数

React-Leaflet-v3 可重用自定义控件

背景

对于React Leaflet v2,有一个NPM插件react-leaflet-control,它允许您创建任何类型的控件并将其放入react-leaflet控件容器中。显然,随着 RL-v3 的引入,随着 API 的更改,这在 v3 中不再适用。我想创建一个自定义控件包装器,以允许我在其中放置任何类型的 React Node。

当前状态

我目前拥有的代码可以工作......但不能。我从 Stack Overflow 帖子中的示例中提取了内容:React Leaflet V3 Custom Control,它让我获得了创建自定义控件的 99% 解决方案。但是,我的用例是地图上的工具栏,其中包含可交互的按钮(颜色用于指定活动工具)。然而,通过这段代码,我拥有了该功能,但由于每次渲染都会导致创建一个新控件,因此工具提示会在失去其锚元素时闪烁。

期望的行为

我想要一个工具栏,允许用户选择工具在地图上执行操作(想想老式的)leaflet-draw。为了提供反馈,我希望按钮在工具处于活动状态时改变颜色,对于用户体验,我想要工具提示来描述操作按钮的。

实际行为

工具栏存在,用户可以选择工具并且有 UI 反馈,但是,当选择工具时在每个渲染上删除并重新添加控件时,工具提示会丢失其锚元素。

代码沙箱

https://codesandbox.io/s/react-leaflet-custom-control-n1xpv

leaflet reactjs react-leaflet react-leaflet-v3

2
推荐指数
1
解决办法
1577
查看次数

Next JS 13 上的 LeafLe 实现

我尝试在 Next JS 13.0.1 项目中实现 LeafLet 地图组件,但地图组件的渲染出现问题。

第一次加载地图组件时,出现这样的错误:

ReferenceError: window is not defined
    at eval (webpack-internal:///(sc_client)/./node_modules/leaflet/dist/leaflet-src.js:229:19)
    at eval (webpack-internal:///(sc_client)/./node_modules/leaflet/dist/leaflet-src.js:7:11)
    at eval (webpack-internal:///(sc_client)/./node_modules/leaflet/dist/leaflet-src.js:9:3)
    at Object.(sc_client)/./node_modules/leaflet/dist/leaflet-src.js (C:\desenvolvimento\estacionai-front\.next\server\app\page.js:482:1)
    at __webpack_require__ (C:\desenvolvimento\estacionai-front\.next\server\webpack-runtime.js:33:43)
    at eval (webpack-internal:///(sc_client)/./node_modules/leaflet-defaulticon-compatibility/dist/leaflet-defaulticon-compatibility.js:2:18)
    at eval (webpack-internal:///(sc_client)/./node_modules/leaflet-defaulticon-compatibility/dist/leaflet-defaulticon-compatibility.js:4:2)
    at Object.(sc_client)/./node_modules/leaflet-defaulticon-compatibility/dist/leaflet-defaulticon-compatibility.js (C:\desenvolvimento\estacionai-front\.next\server\app\page.js:472:1)  
    at __webpack_require__ (C:\desenvolvimento\estacionai-front\.next\server\webpack-runtime.js:33:43)
    at eval (webpack-internal:///(sc_client)/./components/Mapa.tsx:11:91)
Run Code Online (Sandbox Code Playgroud)

无论如何,地图会加载,但标记之类的东西不会出现

在此输入图像描述

真正的问题是当页面重新加载时,是硬重新加载或链接引用。出现此错误:

TypeError: Cannot read properties of undefined (reading 'default')
    at resolveModuleMetaData (webpack-internal:///(sc_server)/./node_modules/next/dist/compiled/react-server-dom-webpack/server.browser.js:195:82)
    at serializeModuleReference (webpack-internal:///(sc_server)/./node_modules/next/dist/compiled/react-server-dom-webpack/server.browser.js:1298:50)
    at resolveModelToJSON (webpack-internal:///(sc_server)/./node_modules/next/dist/compiled/react-server-dom-webpack/server.browser.js:1660:40)
    at Array.toJSON (webpack-internal:///(sc_server)/./node_modules/next/dist/compiled/react-server-dom-webpack/server.browser.js:1081:40)
    at stringify (<anonymous>)
    at processModelChunk (webpack-internal:///(sc_server)/./node_modules/next/dist/compiled/react-server-dom-webpack/server.browser.js:163:36)
    at retryTask (webpack-internal:///(sc_server)/./node_modules/next/dist/compiled/react-server-dom-webpack/server.browser.js:1823:50)
    at performWork (webpack-internal:///(sc_server)/./node_modules/next/dist/compiled/react-server-dom-webpack/server.browser.js:1856:33)
    at AsyncLocalStorage.run (node:async_hooks:330:14) …
Run Code Online (Sandbox Code Playgroud)

leaflet typescript reactjs react-leaflet next.js

2
推荐指数
1
解决办法
5477
查看次数

使图像叠加的地图视图适合容器传单的大小

我正在使用 React Leaflet 创建自定义地图。

当前正在渲染卡片(图像叠加),但它不会填充放置卡片的容器。

容器的大小是严格设置的,我希望地图尽可能填充容器。所有使用 CSS 调整大小的尝试都失败了。

实例: https: //codesandbox.io/s/dark-worker-8qbzfr

我的代码:

import "./styles.css";
import { MapContainer, ImageOverlay } from "react-leaflet";
import "leaflet/dist/leaflet.css";

const M = ({ width, height, zoom, center }) => {
  const wh = [width, 500];
  const origin = [0, 0];
  const bounds = [origin, wh];

  return (
    <div style={{ width: "1100px", height: "600px" }}>
      <MapContainer
        style={{ height: "100%", minHeight: "100%" }}
        bounds={zoom ? undefined : bounds}
        boundsOptions={{
          padding: [0, 0]
        }}
        maxBounds={bounds}
        zoom={center ? zoom : …
Run Code Online (Sandbox Code Playgroud)

javascript css leaflet reactjs react-leaflet

2
推荐指数
1
解决办法
1812
查看次数

Leaflet Vue 3错误(未捕获(承诺中)TypeError:t未定义)

我收到此错误并注意到已加载

Uncaught (in promise) TypeError: t is undefined
    Ye vue-leaflet.es.js:46
    setup vue-leaflet.es.js:1205
    callWithErrorHandling runtime-core.esm-bundler.js:155
    callWithAsyncErrorHandling runtime-core.esm-bundler.js:164
    __weh runtime-core.esm-bundler.js:2684
    flushPostFlushCbs runtime-core.esm-bundler.js:341
    flushJobs runtime-core.esm-bundler.js:395
    promise callback*queueFlush runtime-core.esm-bundler.js:280
    queuePostFlushCb runtime-core.esm-bundler.js:302
    queueEffectWithSuspense runtime-core.esm-bundler.js:1576
    scheduler runtime-core.esm-bundler.js:1798
    triggerEffect reactivity.esm-bundler.js:394
    triggerEffects reactivity.esm-bundler.js:384
    triggerRefValue reactivity.esm-bundler.js:1000
    node_modules chunk-LQ5UJQYN.js:1429
    triggerEffect reactivity.esm-bundler.js:394
    triggerEffects reactivity.esm-bundler.js:379
    triggerRefValue reactivity.esm-bundler.js:1000
    node_modules chunk-LQ5UJQYN.js:1429
    triggerEffect reactivity.esm-bundler.js:394
    triggerEffects reactivity.esm-bundler.js:379
    triggerRefValue reactivity.esm-bundler.js:1000
    set value reactivity.esm-bundler.js:1045
    finalizeNavigation vue-router.mjs:3324
    pushWithRedirect vue-router.mjs:3197
    promise callback*pushWithRedirect vue-router.mjs:3164
    push vue-router.mjs:3089
    install vue-router.mjs:3520
    use runtime-core.esm-bundler.js:4349
    <anonymous> main.ts:10
.
.
.
.
Run Code Online (Sandbox Code Playgroud)

我的代码是这样的

                    <div class="map">
                        <l-map ref="map" …
Run Code Online (Sandbox Code Playgroud)

leaflet vue.js vuejs3 vue-composition-api

2
推荐指数
1
解决办法
1616
查看次数

如何将js传单与Backbone js集成?

我正在尝试开发一个基于Backbone JS的应用程序.我想嵌入一个基于传单JS的OpenStreetMap地图,但我找不到任何教程.

javascript openstreetmap backbone.js leaflet

1
推荐指数
1
解决办法
3638
查看次数

单击鼠标时的传单加载数据和编辑要素属性

我正在从GeoJSON文件加载地图数据并为每个多边形附加一个click事件.单击时,脚本应从服务器获取数据并修改其中一个单击的多边形属性.即:

function onClick(e) {
    var status = e.target.feature.properties.ACCESS;
    $.ajax({
        url: "http://127.0.0.1:8080/?&u=x&p="+e.target.feature.properties.ID_PARCELL,
        dataType: 'jsonp',
        type: 'GET',
        success: function(data) {
        status = data.status;
        e.target.feature.properties.ACCESS = data.status;
        e.target.bindPopup("Owner: <b>"+ data.status +"</b>").openPopup();
        },
        error: function(data){console.log(data)}
    });
    e.target.feature.properties.ACCESS = status;
    map.fitBounds(e.target.getBounds());
}
Run Code Online (Sandbox Code Playgroud)

但由于成功函数是一个回调(同步与否,它并不重要),我无法回到原始事件源(即e),因此我可以修改其中一个属性.

我的问题是:如何在加载此数据后返回事件源?有没有通用的Javascript方式?如果没有,有什么方法可以按功能ID查询GeoJSON图层吗?(=>因此,我可以在ajax调用中发送功能ID,只需将其与响应一起返回)

javascript ajax jquery leaflet

1
推荐指数
1
解决办法
1869
查看次数

LeafLet错误:对象#<Object>在file:///android_asset/www/leaflet.js上没有方法'onAdd':6

我想了解Leaflet的工作原理.我正在尝试教程.我从教程中删除了一些代码以获得更干净的代码.现在有了L.control.layers的问题.

如果我想添加这样的叠加层

var overlays = {
          "Cities": cities
            };

var layersControl = L.control.layers(null, overlays);
Run Code Online (Sandbox Code Playgroud)

添加叠加层来控制没有问题.使用此代码,我可以通过单击复选框显示/隐藏图层

但是,如果我想添加这样的叠加层

 var overlays = {
              "Cities": cities
                };
var layersControl = L.control.layers();
layersControl.addOverlay(overlays);
Run Code Online (Sandbox Code Playgroud)

叠加层存在问题.这里当我想通过单击复选框显示/隐藏图层时,出现错误.

未捕获的TypeError:对象#在文件中没有方法'onAdd':///android_asset/www/leaflet.js:6

未捕获的TypeError:对象#在文件中没有方法'onRemove':///android_asset/www/leaflet.js:6

我必须使用2.段代码.谁能帮我 ?

完整代码在这里

var cities = new L.LayerGroup();

 L.marker([39.61, -105.02]).bindPopup('This is Littleton, CO.').addTo(cities),
            L.marker([39.74, -104.99]).bindPopup('This is Denver, CO.').addTo(cities),
            L.marker([39.73, -104.8]).bindPopup('This is Aurora, CO.').addTo(cities),
            L.marker([39.77, -105.23]).bindPopup('This is Golden, CO.').addTo(cities);


            var cmAttr = 'Map data &copy; 2011 OpenStreetMap contributors, Imagery &copy; 2011 CloudMade',
                cmUrl = 'http://{s}.tile.cloudmade.com/BC9A493B41014CAABB98F0471D759707/{styleId}/256/{z}/{x}/{y}.png';



            var …
Run Code Online (Sandbox Code Playgroud)

javascript leaflet

1
推荐指数
1
解决办法
1782
查看次数