You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Openlayers实现星形绘制功能时报Uncaught TypeError问题求助

问题原因

你代码里的geometryFunction执行顺序错误,在newCoordinates变量还未定义、计算的前提下,提前调用new ol.geom.Polygon([newCoordinates])和geometry.setCoordinates([newCoordinates]),给geometry传入了未定义的坐标值,导致OpenLayers内部判断坐标长度时读取undefined的length属性,触发你遇到的报错。

修复方案

删除开头多余的错误初始化逻辑,同时增加坐标长度校验,避免拖拽过程中坐标点数不足的报错,修复后的代码如下:

var starInteraction = new ol.interaction.Draw({
  source: vectorLayer.getSource(),
  type: 'Polygon',
  geometryFunction: function (coordinates, geometry) {
    // 先校验坐标点数是否足够:至少要有中心点和拖拽终点两个点
    if (coordinates.length < 2) return geometry;
    var center = coordinates[0];
    var last = coordinates[1];
    var dx = center[0] - last[0];
    var dy = center[1] - last[1];
    var radius = Math.sqrt(dx * dx + dy * dy);
    var rotation = Math.atan2(dy, dx);
    var newCoordinates = [];
    var numPoints = 12;
    for (var i = 0; i < numPoints; ++i) {
      var angle = rotation + i * 2 * Math.PI / numPoints;
      var fraction = i % 2 === 0 ? 1 : 0.5;
      var offsetX = radius * fraction * Math.cos(angle);
      var offsetY = radius * fraction * Math.sin(angle);
      newCoordinates.push([center[0] + offsetX, center[1] + offsetY]);
    }
    newCoordinates.push(newCoordinates[0].slice());
    // 统一处理geometry初始化和坐标赋值
    if (!geometry) {
      geometry = new ol.geom.Polygon([newCoordinates]);
    } else {
      geometry.setCoordinates([newCoordinates]);
    }
    return geometry;
  }
}); 
starInteraction.setActive(false);
starInteraction.on('drawend', onDrawend);

核心调整点

  • 移除了开头未定义newCoordinates时的错误赋值逻辑,把geometry初始化的逻辑移到坐标计算完成之后
  • 增加了坐标长度校验,在用户刚点击第一次、还没拖拽出第二个点的时候直接返回,避免读取coordinates[1]时报错

内容的提问来源于stack exchange,提问作者Geographos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 19:36:04