如何在 JavaScript 中围绕折线绘制多边形?

2023-12-21

我想围绕折线绘制一个多边形。在我的例子中,折线是 Google 地图方向,我需要在 Google 地图画布内显示其周围的多边形。

First:

对于偏移,我使用 JavaScript Clipper 库。我有以下折线(路线):我使用 Clipper 在下面制作一个偏移多边形:

我有一个工作JS Bin 示例 http://jsbin.com/oVIcowo/1.

代码是:

<html>
  <head>
    <title>Javascript Clipper Library / Offset polyline</title>
    <script src="clipper.js"></script>
    <script>
    function draw() {
      var polygons = [[{"X":72,"Y":59.45},{"X":136,"Y":66},{"X":170,"Y":99},{"X":171,"Y":114},{"X":183,"Y":125},{"X":218,"Y":144},{"X":218,"Y":165},{"X":226,"Y":193},{"X":254,"Y":195},{"X":283,"Y":195},{"X":292,"Y":202},{"X":325,"Y":213},{"X":341,"Y":234},{"X":397,"Y":245},{"X":417,"Y":248}]]; 
      var scale = 100;
      reverse_copy(polygons);
      polygons = scaleup(polygons, scale);
      var cpr = new ClipperLib.Clipper();
      var delta = 25;
      var joinType = ClipperLib.JoinType.jtRound;
      var miterLimit = 2;
      var AutoFix = true;
      var svg, offsetted_polygon,
      cont = document.getElementById('svgcontainer');
      offsetted_polygon = cpr.OffsetPolygons(polygons, delta * scale, joinType, miterLimit, AutoFix);
      //console.log(JSON.stringify(offsetted_polygon));

      // Draw red offset polygon
      svg = '<svg style="margin-top:10px;margin-right:10px;margin-bottom:10px;background-color:#dddddd" width="540" height="340">';
      svg += '<path stroke="red" fill="red" stroke-width="2" stroke-opacity="0.6" fill-opacity="0.2" d="' + polys2path(offsetted_polygon, scale) + '"/>';

      //Draw blue polyline
      svg += '<path stroke="blue" stroke-width="3" d="' + polys2path(polygons, scale) + '"/>';
      svg += '</svg>';

      cont.innerHTML += svg;
    }

    // helper function to scale up polygon coordinates
    function scaleup(poly, scale) {
      var i, j;

      if (!scale)
        scale = 1;

      for(i = 0; i < poly.length; i++) {
        for(j = 0; j < poly[i].length; j++) {
          poly[i][j].X *= scale;
          poly[i][j].Y *= scale;
        }
      }

      return poly;
    }

    // converts polygons to SVG path string
    function polys2path (poly, scale) {
      var path = "", i, j;

      if (!scale)
        scale = 1;

      for(i = 0; i < poly.length; i++) {
        for(j = 0; j < poly[i].length; j++) {
          if (!j)
            path += "M";
          else
            path += "L";
          path += (poly[i][j].X / scale) + ", " + (poly[i][j].Y / scale);
        }
        path += "Z";
      }

      return path;
    }

    function reverse_copy(poly) {
      // Make reverse copy of polygons = convert polyline to a 'flat' polygon ...
      var k, klen = poly.length, len, j; 

      for (k = 0; k < klen; k++) {
        len = poly[k].length;
        poly[k].length = len * 2 - 2;

        for (j = 1; j <= len - 2; j++) {
          poly[k][len - 1 + j] = {
            X: poly[k][len - 1 - j].X,
            Y: poly[k][len - 1 - j].Y
          }
        }
      }
    }
    </script>
  </head>
  <body onload="draw()">
    <h2>Javascript Clipper Library / Offset polyline</h2>
    This page shows an example of offsetting polyline and drawing it using SVG.
    <div id="svgcontainer"></div>
  </body>
</html> 

所有这一切都很好,但现在我必须用 Google 地图方向的点替换多边形变量,所以我做了以下更改:

directionsService.route(request, function(response, status) {
  if (status == google.maps.DirectionsStatus.OK) {
    directionsDisplay.setDirections(response);

    function draw() {
      var polygons = response.routes[0].overview_path; 

      //REST OF CODE
    }
  }
}

我有一个JS Bin 示例 http://jsbin.com/uTATePe/9使用此代码来偏移折线周围的多边形。

但有一些问题,我无法识别,也无法获得围绕方向的多边形。

有什么办法可以解决这个问题吗?


我的工作解决方案:工作示例 http://www.geocodezip.com/v3_GoogleEx_directions-buffered.html(基于 Manolis Xountasis 的回答)以及这些相关问题的片段:

  1. 如何使用 JSTS 库计算 Google Maps API 中的交叉面积? https://stackoverflow.com/questions/26037104/how-to-calculate-intersection-area-in-google-maps-api-with-jsts-library/26040673#26040673
  2. 谷歌地图多边形自相交检测 https://stackoverflow.com/questions/25017463/google-maps-polygons-self-intersecting-detection/25019306#25019306
  • 包括JSTS库 https://github.com/bjornharrtell/jsts
  • 添加例程以将 google.maps.Polyline 路径转换为 ​​JSTS 对象:
function googleMaps2JTS(boundaries) {
    var coordinates = [];
    var length = 0;
    if (boundaries && boundaries.getLength) length = boundaries.getLength();
    else if (boundaries && boundaries.length) length = boundaries.length;
    for (var i = 0; i < length; i++) {
        if (boundaries.getLength) coordinates.push(new jsts.geom.Coordinate(
        boundaries.getAt(i).lat(), boundaries.getAt(i).lng()));
        else if (boundaries.length) coordinates.push(new jsts.geom.Coordinate(
        boundaries[i].lat(), boundaries[i].lng()));
    }
    return coordinates;
};
  • 并返回 google.maps.LatLng 数组
var jsts2googleMaps = function (geometry) {
  var coordArray = geometry.getCoordinates();
  GMcoords = [];
  for (var i = 0; i < coordArray.length; i++) {
    GMcoords.push(new google.maps.LatLng(coordArray[i].x, coordArray[i].y));
  }
  return GMcoords;
}
  • 获取方向折线路线服务 https://developers.google.com/maps/documentation/javascript/directions并缓冲它
directionsService.route(request, function (response, status) {
    if (status == google.maps.DirectionsStatus.OK) {
        directionsDisplay.setDirections(response);
        var overviewPath = response.routes[0].overview_path,
            overviewPathGeo = [];
        for (var i = 0; i < overviewPath.length; i++) {
            overviewPathGeo.push(
            [overviewPath[i].lng(), overviewPath[i].lat()]);
        }

        var distance = 10 / 111.12, // Roughly 10km
            geoInput = {
                type: "LineString",
                coordinates: overviewPathGeo
            };
        var geoInput = googleMaps2JTS(overviewPath);
        var geometryFactory = new jsts.geom.GeometryFactory();
        var shell = geometryFactory.createLineString(geoInput);
        var polygon = shell.buffer(distance);

        var oLanLng = [];
        var oCoordinates;
        oCoordinates = polygon.shell.points[0];
        for (i = 0; i < oCoordinates.length; i++) {
            var oItem;
            oItem = oCoordinates[i];
            oLanLng.push(new google.maps.LatLng(oItem[1], oItem[0]));
        }
        if (routePolygon && routePolygon.setMap) routePolygon.setMap(null);
        routePolygon = new google.maps.Polygon({
            paths: jsts2googleMaps(polygon),
            map: map
        });
    }
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 JavaScript 中围绕折线绘制多边形? 的相关文章

  • javascript 中对象的“异步”循环

    通常 我们可以对数组和对象进行循环来迭代属性 值 但循环是阻塞的 但是 超时可用于模拟异步循环 我设法为数组做到了这一点 http jsfiddle net LHhy2 do stuff function asyncLoop i do st
  • 无法在 JavaScript for 循环中读取 null 的属性“长度”

    我正在尝试制作一个像 Stack Overflow 那样的 Markdown 编辑器 如果我实际上没有在文本区域中键入星号和包含短语的 http 我会收到标题中列出的此错误 如果我只输入包含星号的短语 则错误指的是这一行 if linkif
  • 第一次使用node.js - “ReferenceError:节点未定义”

    我刚刚安装了node js 我尝试编写应该检查版本的node v 但它不起作用 这是输出 gt node v ReferenceError node is not defined at repl 1 2 at REPLServer self
  • Angular 2 Material 2 日期选择器日期格式

    我不知道如何更改材料2日期选择器的日期格式 我已阅读文档 但我不明白我实际上需要做什么 datepicker默认提供的输出日期格式为f e 6 9 2017 我想要实现的目标是将格式更改为类似的格式9 Jun 2017或任何其他 文档htt
  • Javascript - 在加载所有图像后执行

    看了别人的问题我想 window onload 会回答我的问题 我已经尝试过这个 但它会在页面加载时立即执行代码 而不是在图像加载之后 如果有什么区别的话 图像来自 CDN 并且不是相对的 有人知道解决办法吗 我没有使用 jQuery 想要
  • 在鼠标光标位置添加 cytoscape 节点

    我想在画布上的单击事件上的鼠标箭头位置添加一个 cytoscape 节点 我怎样才能做到这一点 我的方法 效果不太好 我可以通过单击创建一个节点 但无法确保创建的节点的位置位于我单击的位置 使用这样的东西 cy click function
  • 如何导入和导出 javascript ES6 类

    我是 javascript 和 nodejs 的新手 我正在使用这个项目来发展我的技能并学习新技术 目前我的项目使用多个相互依赖的类 类文件位于不同的目录中 我当前正在尝试使用 export 和 require 语句来允许在其他文件中引用类
  • 以一定时间间隔连续重复运行 JavaScript 函数

    这是我的第一个问题 希望您尽快回答 我想要代码连续重复一个函数 我尝试了一些代码 但没有成功 我尝试了这段代码 我想在一段时间后重复这个功能 我努力了setInterval and setTimeout 但是 我还没有收到结果 这将重复该任
  • Web 组件 - 服务/非 html 组件

    所以我来自 Angular 想看看如何创建vanilla Web components 现在 从 Angular 开始 我们倾向于将事物分开 组件 充当 HTML CSS 和一些 javascript 然后是 服务 主要负责收集数据和执行不
  • 启用/禁用由用户输入确定的复选框

    我有一个简单的表单 用户可以在其中输入他的联系号码 如果联系号码以 07 开头 则该复选框已启用 其他我需要禁用它的复选框 我已经编写了一些代码 但我面临的问题是 当用户键入 01 时 它会被禁用 但如果他们继续在 01 之后添加任何其他数
  • 搜索深度嵌套数组以更新对象

    我有一个深层嵌套的数据结构 我有兴趣匹配数组 和数组数组 中的某个值 然后将一些数据推送到随附的数组中 例如以下是我的数组colors并伴随着的是更多颜色数组可能存在也可能不存在 var myData color green moreCol
  • 确定元素是在页面折叠上方还是下方

    我有一些页面有多个输入框 用户可以在其中输入文本 在单击 下一步 按钮之前 需要填写其中一些内容 我弹出验证错误供用户查看 但是如果问题不在页面上 我希望页面滚动到它 而不是他们必须搜索丢失 错误的字段 我有一个滚动到位 但我无法确定要滚动
  • 判断一个数字是否能被 3 或 5 整除 (FizzBu​​zz)

    如何根据输出是否能被 3 或 5 整除来更改输出 如果它能被 3 整除 我想显示 rock 如果它能被 5 整除 我想显示 star 类似于 FizzBu zz 如果两者都有 他们都会看到 这是我的代码 if var n Math floo
  • ToggleClass 动画 jQuery?

    我的网站上有一个部分 当用户单击时我希望它展开 我正在使用 jQuerytoggleClass为了这 expandable function e e preventDefault this closest article toggleCla
  • 如何检测元素内容何时发生变化

    我正在寻找一种方法来监视元素内动态填充 无页面重新加载 内容 以便我可以将类添加到另一个元素 到目前为止我有这个 HTML div class message container div class messages error span
  • Node.js 未处理的“错误”事件

    我编写了一个简单的代码并将其保存在文件 try js 中 var http require http var makeRequest function message var options host localhost port 8080
  • Knockout.js 安全绑定

    我想使用带有淘汰赛的安全绑定 为此我使用敲除安全绑定 js https github com brianmhunt knockout secure binding 谁能解释一下为什么下面的代码不起作用 它会抛出一个错误 未捕获 淘汰 安全
  • mozilla pdf.js 没有全视图

    我喜欢这个 pdf 查看器https github com mozilla pdf js https github com mozilla pdf js Demo http mozilla github com pdf js web vie
  • 如何使用 jQuery 或 JavaScript 聚焦 或 标签?

    for var i 0 i
  • 无法使用 HTML 设置未定义 jQuery UI 自动完成的属性“_renderItem”

    我使用以下代码将 jQuery UI 自动完成项呈现为 HTML 这些项目在自动完成控件中正确呈现 但我不断收到此 JavaScript 错误并且无法移动过去 Firefox 无法转换 JavaScript 参数 Chrome 无法设置未定

随机推荐

  • 苹果推送通知分发证书签名请求是否需要与分发证书用于签署应用程序的请求相同?

    我有一个已创建的现有应用程序 并且最近配置了推送通知 配置时 系统要求我上传证书签名请求 CSR 我不再拥有用于发布应用程序的原始 CSR 这是我需要上传到推送通知配置才能接收推送通知证书的 CSR 吗 我有带有可用私钥的分发证书 我尝试创
  • Angular 4上的动画似乎没有过渡效果

    trigger expandCollapse state open style height state close style height 0px transition open lt gt close animate 1000 使用此
  • postgres中的SQL将重复事件的日期时间转换为未来的日期时间

    我仅使用日期时间来跟踪表中每周重复发生的事件 我只关心时间和它所在的星期几 我需要能够将设置的 DATETIME 转换为当前或即将到来的未来日期 IE 如何转换存储为的日期2013 02 22 12 00 00使用当前日期到下一次出现的日期
  • 这种不良做法/反模式的名称是什么?

    我试图向我的团队解释为什么这是不好的做法 并且正在寻找反模式参考来帮助我的解释 这是一个非常大的企业应用程序 因此这里有一个简单的示例来说明所实现的内容 public void ControlStuff var listOfThings L
  • 使用 cxf 和 java 第一种方法编写异步服务

    我需要使用 cxf 和 java 第一种方法创建一个异步 Web 服务 但我无法 找到任何可以告诉我如何执行此操作的网络资源 网站吗 您能告诉我如何使用 CXF 和 java 第一种方法编写异步 Web 服务吗 Thanks Shekhar
  • FMDB开放数据库

    我正在尝试打开资源中项目中的数据库 问题是好像找不到数据库文件 我尝试使用完整路径 它有效 但这不是一个好的解决方案 我现在想知道如何打开它 我正在使用这段代码 db FMDatabase databaseWithPath bbdd sql
  • htaccess 从 url 中删除字符并重定向

    我想脱衣 来自网址 例子 mysite com something想要重定向到mysite com something 通过启用 mod rewrite 和 htaccesshttpd conf然后将此代码放入您的 htaccess und
  • Select2:如何防止标签排序

    当用户选择许多项目 标签 时 它们会自动按字母顺序排序 如何使用Select2 4 0防止自动排序并保留用户的顺序 Update 提到的 可能的重复问题 适用于旧版本的 Select2 v3 我询问版本 4 它与旧版本不同 并且提到的答案不
  • flake8 抱怨过滤器子句中的布尔比较“==”

    我在 mysql 数据库表中有一个布尔字段 table model class TestCase Base tablename test cases obsoleted Column obsoleted Boolean 要获取所有未过时测试
  • 本地修改数据的 Firebase 同步:处理错误和全局状态

    我有两个相关问题Firebase 网络平台 https www firebase com docs web s 将本地修改的数据同步到服务器 https www firebase com docs web guide offline cap
  • 不可变的@ConfigurationProperties

    Spring Boot 是否可以拥有不可变 最终 字段 ConfigurationProperties注解 下面的例子 ConfigurationProperties prefix example public final class My
  • 在xml中引用xsd时xsl转换问题

    我对 XSL 相当陌生 需要有关转换问题的帮助 我有一个由 XSD 描述的 XML 文件 我使用 XSL 文件将 XML 转换为 HTML 我想在 XML 文件中引用 XSD 但是当我这样做时 XML 不会被转换 XML 示例
  • 您可以将宽度应用于 :before/:after 伪元素 (content:url(image)) 吗?

    这是我最近的问题的补充 是否可以使用伪元素使包含元素环绕绝对定位元素 如clearfix https stackoverflow com questions 14977324 is it possible to use pseudo ele
  • Android:进度对话框在加载时更改 ProgressDialog.setMessage()

    我希望有人可以帮助我弄清楚如何仅使用一个虚拟计时器来更改进度对话框中的设置消息对话框 该虚拟计时器通过字符串数组或任何其他方式循环 例如 在加载时 它可以说正在加载 gt 构建 gt 渲染 gt 等 就像一个 1 2 秒计时器 这只是为了我
  • 为什么 DYLD_LIBRARY_PATH 没有在这里传播?

    我有一个简单的 C 程序 我试图运行该程序 该程序与我之前构建的 Boost Thread 库的版本链接 我似乎无法理解运行时库路径在 OS X 上的行为方式 由于我的 Boost 库没有RPATH 相对安装名称 https develop
  • printf 双精度数的舍入行为

    有人可以解释这种行为吗 我很清楚浮点数的机器级表示 这似乎与 printf 及其格式有关 这两个数字都用浮点表示法精确表示 检查 乘以 64 给出一个整数 include
  • 如何将音频文件从android客户端发送到servlet服务器

    我想将音频文件 mp3 文件从 android 客户端发送到 servlet 服务器并将其保存在某个位置 如果我在该位置播放保存的 mp3 文件 它应该可以播放 我的问题是有没有办法将 mp3 文件直接从客户端发送到服务器并在 servle
  • 防病毒软件正在阻止 nodemailer - 错误:证书链中的自签名证书

    我正在使用 Nodemailer 发送电子邮件 但我的防病毒软件阻止了 Nodemailer 当我关闭防病毒软件时 发送电子邮件没有问题 有没有可能的方法使用nodemailer发送电子邮件而不禁用防病毒软件 const transport
  • 是否可以开发具有蓝牙功能的 iOS 应用程序?

    以下情况可能吗 假设我有一个具有蓝牙功能的秤 当我打开它时 它会通过 BT 发送重量 从技术上讲是否可以开发一款与体重秤配对并从中接收数据的 iOS 应用程序 据苹果公司称 技术问答 QA1657 使用外部 带蓝牙的配件框架 设备 http
  • 如何在 JavaScript 中围绕折线绘制多边形?

    我想围绕折线绘制一个多边形 在我的例子中 折线是 Google 地图方向 我需要在 Google 地图画布内显示其周围的多边形 First 对于偏移 我使用 JavaScript Clipper 库 我有以下折线 路线 我使用 Clippe