【问题标题】:Leaflet Marker not found production env未找到传单标记生产环境
【发布时间】:2016-12-14 13:52:20
【问题描述】:

传单有问题。

在开发中一切正常,但在生产中,我的应用无法找到 marker-icon.pngmarker-shadow.png 图像。

它正在寻找路径assets/station/images/marker-icon.png

Leaflet js 在我的 html.erb 文件中包含这样的内容

<script src="https://cdnjs.cloudflare.com/ajax/libs/leaflet/0.7.5/leaflet.js"></script>

<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/leaflet/0.7.5/leaflet.css" />

如果有人可以帮忙!

【问题讨论】:

  • Leaflet 的哪个版本?您如何部署 Leaflet JS 和 CSS 文件?这些文件来自哪里(框架、手动下载等)?
  • 我已经编辑了我的帖子!
  • 请在下面查看我的回答,如果对您有帮助,请点赞或标记为已接受。

标签: javascript ruby-on-rails leaflet erb


【解决方案1】:

这是 Leaflet 中的一个已知错误,根本问题是在捆绑过程中错误地引用了 Leaflet 的图标图像位置。

您可以验证这是您的问题,购买验证此参数(在运行时):L.Icon.Default.prototype._getIconUrl()
正确的值应该是&lt;some_directory&gt;/leaflet/dist/images/
但是,如果您遇到此错误,则其值为:data:image/png;base64,iVBO....K5CYII=")undefined

根据您使用的捆绑加载器(Vanila WebPack、Angular-Cli - WebPack 的超集等),有不同的解决方案(变通方法)。

您可以在此处查看原始问题(以及不同的解决方案,具体取决于您的 bandle-loader):
https://github.com/Leaflet/Leaflet/issues/4968

如果您使用的是 Angular-Cli,此解决方案将适合您。 在设置 Maker 之前在某处添加此代码:

import { icon, Marker } from 'leaflet';
const iconRetinaUrl = 'assets/marker-icon-2x.png';
const iconUrl = 'assets/marker-icon.png';
const shadowUrl = 'assets/marker-shadow.png';
const iconDefault = icon({
  iconRetinaUrl,
  iconUrl,
  shadowUrl,
  iconSize: [25, 41],
  iconAnchor: [12, 41],
  popupAnchor: [1, -34],
  tooltipAnchor: [16, -28],
  shadowSize: [41, 41]
});
Marker.prototype.options.icon = iconDefault;

(此代码会将损坏的标记的 url 更改为资产文件夹中的有效图像)。

并将此代码添加到您的 angular.json(对于 Angular 版本 >= 6.x)或您的 angular-cli.json(对于 Angular 版本

"assets":
[
   "src/favicon.ico",
   "src/assets",
   {
      "glob": "**/*",
      "input": "node_modules/leaflet/dist/images/", // you may need to change this path, according to your files structure
      "output": "./assets/"
   }
] ...

(此代码会将原始标记图像复制到/assets 文件夹,以便 angular-cli 可以加载它们)

【讨论】:

  • 虽然这可能是对 Angular 的一个很好的解释,但请注意,OP 从未提及使用 JS 捆绑器,它们的错误路径不是数据 URI,并且包括来自 CDN 的旧 (0.x) 传单资产。
  • 此修复适用于 vite (rollup) 和 vue3 构建。进入 node_modules/leaflet/dist/images 并提取这三个标记 png 文件。将它们粘贴在 public/assets 中并开始构建。
【解决方案2】:
import "leaflet/dist/images/marker-shadow.png";

如果使用 webpack,只需导入图片

【讨论】:

  • 您确定这提供了其他答案尚未提供的任何新内容吗?
  • 这是一个不错的单行修复。
  • 这个解决方案很简单,并且可以修复所有角度版本,太棒了
  • 太棒了。这解决了我的问题。我正在使用 ngx 传单。谢谢!
  • 我同意 user43284 - 在我看来,更简单的小代码更好更干净。我可以确认这适用于 Angular10
【解决方案3】:

以下代码对我有用

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")
});

【讨论】:

  • 上述代码 sn-p 出错。错误:“TS2591:找不到名称'require'。您需要为节点安装类型定义吗?尝试npm i @types/node,然后将node 添加到您的tsconfig 中的类型字段”
  • 我不清楚,你是说在哪里添加这段代码?
  • @NashGC 你能详细说明你是如何使用 Nuxt 做到这一点的吗?我在本地将传单导入单个组件而不是使用插件,您将这段代码放在哪里?
  • @Thorvald,我在地图组件的mounted() 方法中使用了它。 (我使用地图的组件)
  • @NashGC 这对我有用.. 但是我的标记在 Safari 浏览器中消失了。知道如何解决这个问题吗?我在传单 1.7.1,vue2-leaflet 2.7.0
【解决方案4】:

在 Angular 10 中工作

对我来说,将 PNG 文件复制粘贴到资产和一个命令

ngOnInit() { L.Icon.Default.ImagePath = "assests/leaflet/" }

【讨论】:

    【解决方案5】:

    我使用Parcel 作为捆绑器并结合TypeScriptLeaflet v1.4(通过npm 安装,以及它的类型)遇到了类似的问题,并使用Gi​​l 的答案以稍微不同的方式解决了它.

    import 'leaflet/dist/leaflet.css';
    import 'leaflet-draw/dist/leaflet.draw.css';
    import L, {
      LatLngExpression,
      FeatureGroup,
      TileLayerOptions,
      LayerEvent,
      LeafletMouseEvent,
      Marker,
      Layer,
      icon,
      LayerGroup,
      GeoJSON
    } from 'leaflet';
    import 'leaflet-draw';
    import iconRetinaUrl from './assets/marker-icon-2x.png';
    import iconUrl from './assets/marker-icon.png';
    import shadowUrl from './assets/marker-shadow.png';
    
    // Assign the imported image assets before you do anything with Leaflet.
    Marker.prototype.options.icon = icon({
      iconRetinaUrl,
      iconUrl,
      shadowUrl,
      iconSize: [25, 41],
      iconAnchor: [12, 41],
      popupAnchor: [1, -34],
      tooltipAnchor: [16, -28],
      shadowSize: [41, 41],
    });
    

    在另一个文件中,我添加了所需的声明,因此 TypeScript 允许我导入 png 图像,例如

    declare module "*.png" {
      const content: string;
      export default content;
    }
    

    另外请注意,如果您使用需要访问这些图像的 Leaflet 插件,您可能还需要明确分配它,例如Leaflet draw 插件也需要它。示例:

            map.addLayer(drawLayer);
            const drawControl = new L.Control.Draw({
              draw: {
                circle: false,
                circlemarker: false,
                marker: {
                  icon: Marker.prototype.options.icon, // Assign icon explicitly
                },
              },
              edit: {
                featureGroup: drawLayer,
              },
            });
            map.addControl(drawControl);
            map.on(L.Draw.Event.CREATED, event => {
              const layer = (event as LayerEvent).layer;
              drawLayer.addLayer(layer);
            });
    

    【讨论】:

      【解决方案6】:

      也许尝试升级到当前版本的传单 - 我从来没有遇到过标记图标的这个问题。

      https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.0.2/leaflet.css
      https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.0.2/leaflet.js
      

      【讨论】:

        【解决方案7】:

        @GilEpshtain 的回答在 Angular 9.1.9 上对我有用。

        附加说明 - 出于调试目的,您应该能够通过将其中一个图标 URL 直接放入浏览器来确认 @GilEpshtain 指定的对 angular.json#assets 的更改已生效。例如 http://localhost:4200/assets/marker-icon.png 应该显示标记图标。

        【讨论】:

          【解决方案8】:

          您可以在小册子 css 中更改图标的当前路径。 所以不要用urlleaflet.css,下载文件改一下。

          .leaflet-default-icon-path {
              background-image: url(https://unpkg.com/leaflet@1.7.1/dist/images/marker-icon.png);
          }
          

          【讨论】:

            【解决方案9】:

            答案是用小册子 css 更新你的 index.html

             <link rel="stylesheet" href="https://unpkg.com/leaflet@1.7.1/dist/leaflet.css"
               integrity="sha512-xodZBdNfgdfTC5n17Xddt2atTPudf34rdf45erfggrrddfdffdfEdf1HxjVMSvLVW9odfdfcdfdf3rfddfdferdfdfqdfgdfUKLsCC5gdfdfdCXdbqCmblFFAshOdfdfMAS6/kddderfdfeqq/sMZMZ19scRerdfggdfddffd4PsZChyertfgRRRSR7A=="
               crossorigin=""/>
            

            把css放在header中

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多