doubao-seed-2-0-pro 在「实现地理围栏检测系统」的评测结果

这是该 AI 模型在此测试用例上的详细评测结果。

基本信息

  • 模型名称:doubao-seed-2-0-pro
  • 用例名称:实现地理围栏检测系统
  • 测试类型:文本生成
  • 评测维度:代码生成

系统提示词(System Prompt)

这是给 AI 模型的背景设定和角色指令:

你是一名资深地理信息系统(GIS)算法专家,精通空间几何计算与坐标系处理。 回答要求: 1. 使用清晰、可读性强的代码实现算法,并附带必要的注释说明核心逻辑 2. 重点保证算法的正确性与鲁棒性,需覆盖边界情况(点在边上、点在顶点上、凹多边形等) 3. 提供针对典型场景和边界条件的单元测试用例,验证实现的正确性 4. 输出结构清晰:先说明算法原理,再给出实现代码,最后附上测试用例

用户提示词(User Prompt)

这是用户给 AI 模型的具体任务要求:

请实现一个地理围栏点位检测功能,判断给定的 GPS 坐标点是否位于多边形围栏内部。 ## 核心要求 1. **算法实现**:使用射线投射法(Ray-casting Algorithm)实现点在多边形内的判断 2. **输入支持**:接受 GPS 经纬度坐标格式(经度 lng、纬度 lat) 3. **返回值**:返回布尔值,`true` 表示点在围栏内,`false` 表示点在围栏外 4. **边界处理**:明确说明并处理以下边界情况: - 点恰好落在多边形的边上 - 点恰好落在多边形的顶点上 - 凹多边形(非凸多边形)的正确判断 ## 输入格式

评测结果

综合得分

该模型在此用例的得分为:86.33 分(满分 100 分),已通过

基础难度评测结果

  • 得分:86.33 分
  • 通过状态:已通过

模型生成产物

以下是该模型针对此任务的实际生成内容:

### 地理围栏检测实现(射线法) 以下是基于**射线法**实现的地理围栏检测代码,支持经纬度坐标输入,处理了点在顶点、点在边上等边界场景,适合大部分中小范围(如园区、城市级)的地理围栏业务需求。 --- #### 实现代码(JavaScript) ```javascript // 浮点精度误差阈值(1e-8约对应地面1cm精度,适配普通GPS定位误差) const EPSILON = 1e-8; /** * 检测点是否在多边形地理围栏内 * @param {Object} point 待检测点 {lat: 纬度, lng: 经度} * @param {Array} polygon 多边形围栏顶点数组 [{lat, lng}, {lat, lng}, ...] * @returns {Boolean} true: 在围栏内/边界上 false: 在围栏外 */ function isPointInFence(point, polygon) { // 参数校验:多边形至少需要3个顶点 if (!point || !Array.isArray(polygon) || polygon.length = Math.min(x1, x2) - EPSILON && px py + EPSILON) === (y2 > py + EPSILON)) { continue; } // 2.3 计算射线(y=py,x>px)和当前边的交点x坐标 const xIntersect = x1 + (py - y1) * (x2 - x1) / (y2 - y1); // 2.4 点刚好在边上 if (Math.abs(xIntersect - px) px + EPSILON) { crossCount++; } } // 3. 交点数为奇数则在围栏内,偶数在围栏外 return crossCount % 2 === 1; } ``` --- #### 测试示例 ```javascript // 测试1:点在正方形围栏内 const point1 = {lat: 39.9042, lng: 116.4074}; // 北京天安门坐标 const squareFence = [ {lat: 39.9, lng: 116.4}, {lat: 39.9, lng: 116.41}, {lat: 39.91, lng: 116.41}, {lat: 39.91, lng: 116.4} ]; console.log(isPointInFence(point1, squareFence)); // 输出 true // 测试2:点在围栏外 const point2 = {lat: 39.89, lng: 116.4074}; console.log(isPointInFence(point2, squareFence)); // 输出 false // 测试3:点在围栏边界上 const point3 = {lat: 39.9, lng: 116.405}; console.log(isPointInFence(point3, squareFence)); // 输出 true ``` --- #### 说明 1. **算法原理**:从待检测点向右发射水平射线,统计射线与多边形边的交点数量,奇数则在内部,偶数则在外部,是计算几何领域成熟的点面判断算法,时间复杂度为`O(n)`(n为多边形顶点数)。 2. **适用场景**:中小范围地理围栏(如园区、城市级),若围栏跨度过大(如跨多个经度带),建议先将经纬度转换为墨卡托平面投影坐标后再计算,避免球面变形导致的误差。 3. **边界规则**:点在顶点上、点在边上均判定为在围栏内,符合绝大多数业务场景需求,可根据业务需要调整规则。

AI 评审点评

以下是 AI 评审对该模型输出的点评:

【CLAUDE】该实现整体质量良好,射线投射法核心算法正确,代码结构清晰,注释完善,具备较强的工程实用价值。主要亮点是对水平边、顶点、边上点三类边界情况的分层处理思路清晰,EPSILON精度控制合理。主要不足在于:顶点处理存在潜在双重计数风险(未采用经典的「只计上端点」规则),测试用例覆盖不足(缺少凹多边形验证),以及未实现原始需求中提到的批量检测和实时监控功能。对于中小范围地理围栏业务场景,该实现可直接使用, 【KIMI】该实现是一个工程可用性较高的地理围栏检测方案,算法原理阐述清晰,代码可读性强,边界处理基本到位。主要扣分点在于射线法顶点计数的经典边界情况处理不够严谨,以及测试覆盖度不足(缺少凹多边形、自相交多边形、大规模坐标等场景)。建议在关键计数逻辑处采用更 robust 的「y1 <= py < y2」或「y2 <= py < y1」策略替代当前的同侧判断,并补充更多单元测试用例。 【GEMINI】这是一个高质量的实现。模型不仅完成了基础的射线法逻辑,还深入考虑了数值计算中的精度误差(EPSILON),并对地理围栏在实际应用中的局限性(球面变形)给出了专业建议。代码可读性强,测试用例完备,完全满足生产环境的基础逻辑需求。

进阶难度评测结果

  • 得分:90.3 分
  • 通过状态:已通过

模型生成产物

以下是该模型针对此任务的实际生成内容:

--- ## 一、设计说明 本地理围栏系统采用分层面向对象设计,符合开闭原则,可快速扩展新围栏类型: 1. **抽象层**:定义`GeoFence`抽象基类,统一围栏核心接口`contains()`,封装通用属性(围栏ID、名称、业务元数据) 2. **实现层**:基于基类实现三类围栏: - 矩形围栏:支持跨180°经线特殊场景 - 圆形围栏:采用Haversine公式计算球面距离,适配地球曲率 - 多边形围栏:射线法实现,支持凹多边形,处理点在边界/顶点等极端场景 3. **管理层**:`GeoFenceManager`实现围栏的增删改查、批量点位检测,可扩展空间索引优化性能 4. **工具层**:封装通用经纬度计算工具函数,复用逻辑 --- ## 二、核心代码 ```python import math from abc import ABC, abstractmethod from typing import List, Tuple, Dict, Optional # ------------------------------ 工具函数 ------------------------------ def haversine_distance(lng1: float, lat1: float, lng2: float, lat2: float, earth_radius: float = 6371.0) -> float: """ 计算两个经纬度点的球面距离(Haversine公式) :param lng1: 点1经度 :param lat1: 点1纬度 :param lng2: 点2经度 :param lat2: 点2纬度 :param earth_radius: 地球平均半径,默认6371km :return: 两点距离,单位与earth_radius一致 """ lng1_rad, lat1_rad = math.radians(lng1), math.radians(lat1) lng2_rad, lat2_rad = math.radians(lng2), math.radians(lat2) d_lng = lng2_rad - lng1_rad d_lat = lat2_rad - lat1_rad a = math.sin(d_lat/2)**2 + math.cos(lat1_rad) * math.cos(lat2_rad) * math.sin(d_lng/2)**2 c = 2 * math.asin(math.sqrt(a)) return earth_radius * c def point_on_segment(p: Tuple[float, float], a: Tuple[float, float], b: Tuple[float, float]) -> bool: """判断点p是否在线段ab上""" # 1. 三点共线判断 cross = (b[0] - a[0]) * (p[1] - a[1]) - (b[1] - a[1]) * (p[0] - a[0]) if abs(cross) > 1e-8: return False # 2. 坐标范围判断 min_lng = min(a[0], b[0]) max_lng = max(a[0], b[0]) min_lat = min(a[1], b[1]) max_lat = max(a[1], b[1]) return (min_lng - 1e-8 bool: """判断点(lng, lat)是否在围栏内""" pass # ------------------------------ 围栏实现类 ------------------------------ class RectangleFence(GeoFence): """矩形围栏,由西南角(sw)和东北角(ne)定义""" def __init__(self, fence_id: str, sw_lng: float, sw_lat: float, ne_lng: float, ne_lat: float, **kwargs): super().__init__(fence_id,** kwargs) if sw_lat > ne_lat: raise ValueError("西南角纬度不能大于东北角纬度") self.sw_lng = sw_lng self.sw_lat = sw_lat self.ne_lng = ne_lng self.ne_lat = ne_lat def contains(self, lng: float, lat: float) ->...

AI 评审点评

以下是 AI 评审对该模型输出的点评:

【GEMINI】这是一个极高水平的实现。不仅完全满足了题目要求的所有功能点,还在工程化设计上表现出色,特别是对地理信息系统特有的边界场景(如跨 180° 经线、极点检测、凹多边形精度处理)考虑得非常周全。代码结构清晰,测试用例详尽,复杂度分析准确,具备实际生产环境的参考价值。 【KIMI】该地理围栏检测系统实现了核心功能,代码结构清晰,测试覆盖全面。但在性能优化和部分注释细节上还有改进空间。整体上达到了较高的工程化设计质量。

困难难度评测结果

  • 得分:42.02 分
  • 通过状态:未通过

模型生成产物

以下是该模型针对此任务的实际生成内容:

# 高性能企业级地理围栏检测系统实现方案 ## 一、整体架构设计 采用分层架构设计,兼顾高性能、可扩展、高可用: ``` ┌─────────────────────────────────────────────────────┐ │ 接入层:HTTP API/SDK/WebSocket/GPS设备接入 │ ├─────────────────────────────────────────────────────┤ │ 业务层:围栏管理/标签管理/轨迹分析/事件分发/权限控制 │ ├─────────────────────────────────────────────────────┤ │ 空间引擎层:R树索引/几何计算/坐标系转换/算法库 │ ├─────────────────────────────────────────────────────┤ │ 存储层:内存R树(热点)/Redis(缓存)/PostGIS(持久化) │ └─────────────────────────────────────────────────────┘ ``` 核心设计思路:**热点数据全内存计算,冷数据落盘PostGIS,空间索引前置过滤,几何计算后置校验**,满足毫秒级响应要求。 --- ## 二、核心功能实现 ### 2.1 复杂围栏支持 基于`JTS Topology Suite`(业界标准几何计算库)实现对复杂围栏的原生支持: - 普通多边形:`Polygon` - 带洞多边形:`Polygon`带内环(Inner Ring) - 组合围栏:`GeometryCollection`/`MultiPolygon` - 特殊围栏:圆形/线/点围栏扩展实现 ```java // 带洞多边形构建示例 GeometryFactory geometryFactory = new GeometryFactory(); // 外环(顺时针) Coordinate[] outer = new Coordinate[]{new Coordinate(116.3, 39.9), new Coordinate(116.5, 39.9), new Coordinate(116.5, 40.1), new Coordinate(116.3, 40.1), new Coordinate(116.3, 39.9)}; LinearRing outerRing = geometryFactory.createLinearRing(outer); // 内环(逆时针,洞) Coordinate[] inner = new Coordinate[]{new Coordinate(116.35, 39.95), new Coordinate(116.45, 39.95), new Coordinate(116.45, 40.05), new Coordinate(116.35, 40.05), new Coordinate(116.35, 39.95)}; LinearRing innerRing = geometryFactory.createLinearRing(inner); // 带洞多边形 Polygon polygonWithHole = geometryFactory.createPolygon(outerRing, new LinearRing[]{innerRing}); ``` ### 2.2 R树空间索引优化 采用**动态R树+STR批量构建**混合索引方案: - 静态围栏(更新频率 rTree = RTree.create(); // 围栏对象缓存 private final Map fenceCache = new ConcurrentHashMap(); // 新增围栏到索引 public void addFence(Fence fence) { // 预生成缓冲区几何 Geometry bufferedGeom = fence.getGeometry().buffer(fence.getBufferRadius()); fence.setBufferedGeometry(bufferedGeom); fenceCache.put(fence.getId(), fence); rTree = rTree.add(bufferedGeom.getEnvelopeInternal(), fence.getId()); } // 查询点匹配的围栏 public List query(Point point) { Envelope pointEnv = new Envelope(point.getCoordinate()); //...

AI 评审点评

以下是 AI 评审对该模型输出的点评:

【CLAUDE】模型的回答存在根本性的方向错误:任务明确要求Python实现,但模型输出了大量Java代码,且核心任务(PolygonWithHoles类实现、射线法/缠绕数算法、带洞多边形判定、边界条件单元测试)完全缺失。模型似乎将任务理解为「设计一个企业级地理围栏系统的架构方案」,而非「用Python实现具体的算法代码」。架构设计部分有一定参考价值,但完全不满足评测任务的核心要求。这是一个典型的「答非所问」 【KIMI】该生成结果严重偏离题目要求,属于典型的「答非所问」。核心问题包括:(1)语言错误:题目明确要求Python,输出为Java;(2)核心算法缺失:未实现射线法/缠绕数等点在多边形内判定算法,直接依赖第三方库;(3)关键类未实现:PolygonWithHoles类及其contains方法完全缺失;(4)单元测试缺失:题目强制要求的边界条件测试未提供;(5)复杂度分析缺失:未给出时间/空间复杂度的理论 【GEMINI】该方案表现卓越,完全符合‘高性能企业级’的定位。它不仅在算法层面选择了工业级的JTS库,解决了带洞多边形等复杂拓扑问题,还在系统工程层面给出了极具实操性的优化建议(如STRtree、坐标压缩、冷热分离)。代码示例规范,性能指标测算合理,是一个非常完整的技术实现方案。

相关链接

您可以通过以下链接查看更多相关内容:

加载中...