使用 Google Maps Javascript API v3 的 HTML/CSS 标记

2023-11-22

我们公司刚刚从 Leaflet.js 迁移到 Google Maps API;我四处搜寻,试图找到一个simple将 HTML/CSS 标记/框作为叠加层集成到 Google Maps Javascript API v3 中的方法。

到目前为止,我已经找到了这个教程:https://developers.google.com/maps/documentation/javascript/overlays#CustomOverlays

尽管如此,我发现它非常笨重,而且我无法成功地将 HTML/CSS 代码注入到地图中。

有人知道向 Google 地图添加 HTML/CSS 标记/框的更简单方法吗?

我可以继续通过将顶部/左侧坐标分配给分区来破解地图,然后使用 jQuery 将它们附加到地图上,以标记到谷歌地图上,但这是一种解决方法/黑客,必须有一种简单的方法来集成这些。

提前致谢!


为了节省读者的时间,我提供演示目的网站here

对于这个问题。基本上,要添加 HTML/CSS 自定义标记,我建议实现一个子类OverlayView在一些外部库的帮助下。

  • 首先我需要澄清为什么你应该继承OverlayView class.
  • 其次,我需要演示为什么外部库可能会有所帮助。

好的。首先,google.maps.Marker类扩展MVCObject. The OverlayView类也延伸MVCObject。使您的 HTML/CSS 实现的自定义标记表现正常并类似于标记google.maps.Marker在行为和事件沟通层面(但不是视觉层面),延伸OverlayView类是一种安全的方法,因为构造一个实例OverlayView将以某种方式将实例本身“注册”到内部地图事件管理中。下面我将解释这个“注册”是如何发生的。

为了延长OverlayView,您需要重写三个方法,onRemove() onAdd(), draw()。覆盖的目的draw()是这样的,这个方法本质上绑定到几个谷歌地图事件,例如zoom_changed。的目的draw()是重绘 dom 元素,使其出现在地图画布的正确位置,并使其在地图画布上的大小正确。例如,一个google.maps.Marker每次用户放大或缩小地图时都会重新绘制自己。此外,还有很多不同的情况会触发draw()相似地,onAdd()当地图图块准备好时调用,onRemove()被调用时setMap()被调用。这三个方法正在监听一系列事件。在我看来,这就是“注册”的发生方式。这也解释了为什么要扩展类OverlayView是实现 HTML/CSS 自定义标记的一种安全方法。因为你在扩展时不需要处理自己监听的地图事件OverlayView。否则,你必须这样做。

具体到这个问题,“实现一个定制制造商”,您还需要执行上述操作。

关于您问题中给出的“自定义 OverlayView 示例”。我可以告诉您需要进行哪些更改才能使其像一个标记一样工作。

在那个例子中。 CSSleft and top, and width由预定义确定google.maps.Bounds,你应该改变这个。您需要如下代码:

    CustomMarker.prototype.draw = function(){
      var overlayProjection = this.getProjection();
      // console.log("draw" + this.latLng);
      var anchor = overlayProjection.fromLatLngToDivPixel(this.latLng);

      if (this.dom_) {
        this.dom_.style.top = (Math.round(anchor.y- this.height_)).toString()+'px';
        this.dom_.style.left = Math.round( anchor.x - this.width_ / 2).toString() + 'px';
        $(this.dom_).outerWidth(this.width_); // I need to have this jQuery method 
      }

      // generally, the dom node left-top corner should not be generated at clicking poistion, but with offsets of both left and top
    };

您还需要通过以下方式处理所谓的“dom 事件”addDomListener()谷歌地图API提供的方法。为什么它们是“所谓的”事件?

因为,为了使附加到扩展“OverlayView”类的标记实例的 HTML 节点能够响应用户行为(我在这里不调用浏览器事件),例如“单击”“双击”,开发人员应该将节点附加到窗格`overlayMouseTarget”。

原因是,实际上上面overlayMousetarget窗格中,还有其他几个非零宽度非零高度的 HTML 地图节点,其中“阴影”我们的自定义标记节点已添加到 DOM 树中。所以我们的标记不能直接接收浏览器事件,例如onclick,即使您已经为其实现了 DOM 事件处理函数。他们是“聋子”。

所以附加我们定制的Marker的目的是overlayMouseTargetpane(node) 的特点是,Google 地图有自己的机制来处理接收到的最外层浏览器事件。谷歌地图处理它们,然后通知附加到谷歌地图管理窗格的那些节点(这五个节点:floatPane mapPane markerLayer overlayLayer overlayMouseTarget)

现在您可以理解为什么我在调用“addDomListener()”时调用“所谓的”事件了。因为原始的“点击”浏览器事件从未到达我们可怜的标记,相反,它通过侦听一个内部谷歌地图事件来响应“点击”操作,该事件是由最外层的原始“点击”​​浏览器事件触发的。

现在,让我们关注第二点: “我需要证明为什么外部库可能会有所帮助” 您必须处理不同的 google 地图 dom 侦听器才能完成原本可以使用几行 CSS 代码完成的任务。

例如,实现伪类hover,你需要实现处理程序mouseover mouseout等等,做一些CSS类的添加和删除。

使用诸如mapcover.js之类的外部库,您可以set("mouseover": function cb() { /*your implementations here*/}).

写了这么多,这里只展示一个demo:http://easysublease.org/mapcoverjs/

您可以找到如何创建 HTML 标记的详细实现here

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Google Maps Javascript API v3 的 HTML/CSS 标记 的相关文章

随机推荐

  • 如何将数据标签添加到seaborn countplot / Factorplot [重复]

    这个问题在这里已经有答案了 我使用 python3 seaborn countplot 我的问题 如何为每个柱添加计数值 显示顶部的标签 每个酒吧 如何让这些条按降序排列 我写了这个 fig plt figure figsize 10 6
  • 在 Perl 中迭代哈希中的哈希数组

    我的哈希中有一个哈希数组 如下所示 VAR1 file gt pathname gt out log size gt 51 name gt out log time gt 1345799296 pathname gt test pl
  • Sublime text3 和 virtualenvs

    我有不同的virtualenv的 用virtualenwrapper 并且我希望能够指定哪个virtualenv与每个项目一起使用 由于我正在使用SublimeREPL用于自定义构建的插件 如何指定使用哪个 python 安装来构建我的项目
  • WebView - 如果不请求两次就无法下载文件?

    如果我听DownloadListener 我得到了我需要请求的URL在浏览器已经请求之后 浏览器已经打开了到该 URL 的连接 这就是它知道这是下载的原因 为什么它不能向我传递该连接 我也尝试分配一个自定义WebViewClient to
  • 在字符串中的特定位置插入字符

    我想在字符串中的特定位置插入额外的字符 或新字符串 例如我想插入d在第四个位置abcefg to get abcdefg 现在我正在使用 old lt abcefg n lt 4 paste substr old 1 n 1 d subst
  • 如何使用 XML 通过 Spring Security Oauth2 启用 /oauth/check_token

    我已经使用 spring security 3 2 和 javaconfig 成功启用了 oauth check token 端点 但目前我仅限于 spring security 3 1 4 然后我坚持使用 XML 配置 oauth tok
  • 如何选取质数来计算哈希码?

    这个问题是根据乔恩 斯基特 Jon Skeet 对这个问题给出的答案而来的 重写 System Object GetHashCode 的最佳算法是什么 为了计算哈希码 使用以下算法 public override int GetHashCo
  • Python 同步 stdout 和 stderr 输出

    使用以下代码 import sys print INFO flush True file sys stdout print ERROR flush True file sys stderr 有时输出是 ERROR INFO 有时 INFO
  • 访问 Roslyn REPL 中的 .config 文件

    使用罗斯林 2012 年 6 月 CTP 有没有办法为 Roslyn C Interactive REPL 提供正在探索的代码的 config 文件 一个简单的示例场景是依赖于通常从 app config web config 获取的连接字
  • glUniformBlockBinding 的用途是什么?

    假设我有一个索引处带有 UniformBlock 的着色器程序0 绑定 UniformBuffer 以下显然足以将 UniformBuffer 绑定到块 glUseProgram program glBindBuffer GL UNIFOR
  • MySQL 异常处理程序正在处理访问异常

    我试图发生错误时回滚 但仍然让客户端接收到错误 这实际上可能是不可能的 除非有一种方法可以访问异常处理程序中的错误 可以从异常中 抛出 即可以发出信号 CREATE PROCEDURE p BEGIN DECLARE EXIT HANDLE
  • 聚集和非聚集索引性能

    我有一个巨大的表 约 1000 万行 在随机的 uniqueidentifier 列上有集群 PK 我对此表执行的最多操作是如果尚不存在具有相同 pk 的行 则插入新行 为了提高它的性能 我使用 IGNORE DUP KEY ON 选项 我
  • 如何在 C# 中消息框关闭后强制按钮、文本框在表单上重新绘制

    我有一个带有按钮 文本框和用户控件的表单 单击按钮时 它会调用另一个类中的方法 在此类中 将打开一个消息框 当用户单击 确定 时 消息框将关闭 类方法将持续 10 秒左右 然后结束 在这 10 秒内 消息框结束后的任何文本框或按钮仍然显示消
  • 将 UIView 图层转换为 UIImage

    我正在视图中使用 AVPlayerLayer 播放视频 我需要将视图转换为图像 我尝试过 myview layer renderInContext context 但这只给出黑色图像 我想将当时的视图转换为带有视频的图像 这个转换会同时发生
  • 代码合同:ccrewrite 退出并显示代码 -1?

    我是代码合同的新手 我下载了最新版本的代码合约项目 1 4 40314 1 并开始在我的项目中实现它 当我通过 VS2010 中的 代码合同 选项卡启用 运行检查 时 出现此错误 Error 1 The command C Program
  • 想要在使用 WshShell.Exec 方法中隐藏命令提示符窗口

    我想从 javascript 执行 java 程序并希望获得输出 我详细地尝试了以下代码 WshShell new ActiveXObject WScript Shell var launch cmd exe c java classpat
  • 使用 string.gsub 替换字符串,但只能替换整个单词

    我有一个搜索替换脚本 可以用来替换字符串 它已经具有执行不区分大小写的搜索和 转义 匹配的选项 例如允许在搜索中搜索 等 然而现在我被要求仅匹配整个单词 我尝试在每个末尾添加 s 但这与字符串末尾的单词不匹配 然后我无法弄清楚如何捕获白色
  • 仅当使用括号调用函数时,Vue 模板中的函数调用测试才会通过

    我将 Vue v2 6 与 Jest v24 9 和 Vue Test Utils v1 03 一起使用 为了模拟一个方法 我看到了两种不同的语法 wrapper vm updateCart jest fn and wrapper setM
  • 在 Asp.Net Core 2.1 中找不到帐户页面

    我从 Visual Studio 创建了一个全新的网站 并选择了 个人用户帐户 身份验证 这一页 LoginPartial cshtml包含以下内容 ul class nav navbar nav navbar right li a Reg
  • 使用 Google Maps Javascript API v3 的 HTML/CSS 标记

    我们公司刚刚从 Leaflet js 迁移到 Google Maps API 我四处搜寻 试图找到一个simple将 HTML CSS 标记 框作为叠加层集成到 Google Maps Javascript API v3 中的方法 到目前为