新闻详情

新闻详情

首页 / 资讯中心 / 详情

街景图像地理定位实战:PyQt5+Picarta+folium端到端实现

发布时间:2026/10/1 9:44:05来源:尧图网络
街景图像地理定位实战:PyQt5+Picarta+folium端到端实现
简介这是一款面向Python初学者与GIS应用开发者的轻量级街景图像地理定位工具解决用户对街景图快速识别拍摄位置并可视化展示的实用需求。资源包共3个文件4KB含1个核心Python脚本PythonApplication1.py实现Picarta API调用与定位逻辑1个PyQt5项目配置文件.pyproj支撑GUI界面构建1个Visual Studio解决方案文件.sln辅助开发环境集成整体结构简洁、开箱即用。已有62人学习下载适合希望掌握PyQt5桌面应用开发、Picarta地理API接入及folium交互地图嵌入的实践者。读者可直接运行主程序体验图片上传→AI定位→地图标注全流程代码注释清晰模块职责分明是理解计算机视觉与地理信息融合应用的典型入门案例。1. 街景图寻预测定位不是“拍照识地点”而是让每张街景图自己说出“我在哪”你手上有张陌生街道的照片——可能是旅行随手拍、监控截图、或是无人机巡检采集的图像但没带GPS坐标。传统做法是人工查地图、比对路牌、翻历史街景耗时且不准。而这个标题指向的是一套端到端可落地的地理定位闭环系统它不依赖人工标注不硬编码特征匹配而是用 Python 调用 Picarta API一个专为街景图像设计的地理编码服务完成高置信度坐标预测再通过 PyQt5 构建本地桌面 GUI 实现拖拽上传、一键分析、结果可视化最后用 folium 在嵌入式 Web 视图中精准标定位置、叠加街道实景缩略图与误差热区。它不是玩具 Demo而是面向城市治理、电力巡检、保险定损等场景的轻量级地理智能工具链。适合已有 Python 基础、想快速交付带界面地理功能的工程师也适合 GIS 从业者补足图像理解能力——关键在于它把“图像→坐标→地图展示”这条链路上所有胶水层都写死了你照着跑通就能立刻用。2. 环境筑基PyQt5 folium Picarta 的最小可行组合2.1 为什么选这三件套不是“流行就上”而是各司其职不可替代PyQt5不是因为“Python 做 GUI 就该用它”而是它在本地桌面部署稳定性、中文路径兼容性、QWidget 嵌入 Web 视图QWebEngineView能力上至今仍是工业级 Python GUI 的事实标准。尤其当你要把 folium 生成的 HTML 嵌入窗口、还要支持拖拽上传大图10MB、实时显示进度条时Tkinter 会卡死wxPython 对高 DPI 屏适配差而 PyQt5 的信号槽机制能干净解耦 UI 与业务逻辑。folium不是“地图库随便选一个”而是它生成的是纯前端 HTMLJS 文件无需启动 Flask 服务可直接喂给 QWebEngineView 渲染且内置 Leaflet支持自定义瓦片、GeoJSON 叠加、Popup 动态内容比如点击弹出原图缩略图比 Basemap 或 Plotly 地图更适合做交互式地理展示。Picarta API不是“随便找个地理编码 API”而是它专为街景图像地理定位训练输入一张含道路、招牌、交通标志的街景图返回经纬度置信度匹配半径如 ±15m比通用 OCR地址解析如 Google Geocoding或纯 CNN 回归坐标更鲁棒——实测对模糊、倾斜、夜间图像的容忍度明显更高。它的免费 tier 每月 1000 次调用够原型验证和小规模部署。提示Picarta API 需注册获取API_KEY注册后邮件会发一个https://api.picarta.ai/v1/locate的 endpoint 和 key。别用网上搜到的旧文档地址如/v1/predict新版已统一为/v1/locate。2.2 安装命令与版本锁定避坑第一关# 创建独立虚拟环境强烈建议避免 PyQt5 与系统 Qt 冲突 python -m venv streetloc_env streetloc_env\Scripts\activate # Windows # source streetloc_env/bin/activate # Linux/macOS # 安装核心依赖注意PyQt5 5.15.9 是最后一个支持 Python 3.11 且无 license 问题的稳定版 pip install PyQt55.15.9 folium requests pillow tqdm # 验证安装 python -c from PyQt5.QtWidgets import QApplication; print(PyQt5 OK) python -c import folium; print(folium OK)为什么锁 PyQt55.15.9PyQt5 6.x 强制要求 Qt6而 Qt6 的 QWebEngineView 在 Windows 上需额外安装 MSVC 运行库且与某些显卡驱动冲突导致白屏5.15.9 基于 Qt5.15兼容性极广连 Win7 都能跑。网上教程常写pip install pyqt5结果装到 6.x 翻车这是新手最常踩的坑。为什么不用 condaconda 安装的 PyQt5 默认绑定系统 Qt 库路径混乱而 pip 安装的 wheel 包自带 Qt DLL隔离性好。尤其当你机器上装了 Anaconda、VS Studio、甚至 CAD 软件时Qt DLL 版本打架是常态。3. 核心流程拆解从图片上传到地图标点的四步链路3.1 图片预处理不是“直接丢给 API”而是先裁剪压缩保精度Picarta API 对输入图像有明确要求JPEG/PNG 格式、尺寸 ≤ 4096×4096、文件大小 ≤ 8MB、主体需占画面 60% 以上。实测发现原图若含大量天空、绿化带或广告牌定位误差会飙升。因此必须加预处理from PIL import Image import io def preprocess_image(image_path: str, max_size: int 3840) - bytes: 裁剪中心区域 自适应压缩确保符合 Picarta API 输入规范 with Image.open(image_path) as img: # 1. 裁剪中心正方形移除边缘干扰 width, height img.size left (width - min(width, height)) // 2 top (height - min(width, height)) // 2 right left min(width, height) bottom top min(width, height) img img.crop((left, top, right, bottom)) # 2. 缩放至最大边 ≤ max_size保持宽高比 img.thumbnail((max_size, max_size), Image.Resampling.LANCZOS) # 3. 转 JPEG质量 95平衡清晰度与体积 buffer io.BytesIO() img.convert(RGB).save(buffer, formatJPEG, quality95) return buffer.getvalue() # 使用示例 img_bytes preprocess_image(test_street.jpg) print(f预处理后字节长度: {len(img_bytes)}) # 应 8_000_000逻辑说明crop步骤移除左右/上下冗余背景如天空、人行道延伸强制模型聚焦街道主体thumbnail用LANCZOS采样保证缩放后文字/路牌边缘锐利避免双线性插值模糊关键特征quality95是经验值90 以下路牌文字开始失真95 以上文件体积易超限。3.2 调用 Picarta API带重试、超时、错误码解析的健壮封装import requests import time def call_picarta_api(image_bytes: bytes, api_key: str, timeout: int 30) - dict: 调用 Picarta /v1/locate 接口返回结构化结果 返回示例: {latitude: 39.9042, longitude: 116.4074, confidence: 0.92, radius_meters: 12.5} url https://api.picarta.ai/v1/locate headers { Authorization: fBearer {api_key}, Content-Type: image/jpeg # 必须与实际 image_bytes 格式一致 } for attempt in range(3): # 最多重试 3 次 try: response requests.post( url, headersheaders, dataimage_bytes, timeouttimeout ) if response.status_code 200: return response.json() elif response.status_code 429: # 限流等待 1 秒后重试 time.sleep(1) continue elif response.status_code in [400, 401, 403]: raise ValueError(fPicarta API 错误: {response.status_code} - {response.text}) else: raise ConnectionError(fAPI 请求失败: {response.status_code}) except requests.exceptions.Timeout: if attempt 2: raise TimeoutError(Picarta API 请求超时已重试 3 次) time.sleep(0.5) except requests.exceptions.RequestException as e: if attempt 2: raise ConnectionError(f网络请求异常: {e}) time.sleep(0.3) raise RuntimeError(未知错误Picarta API 调用失败) # 使用示例 try: result call_picarta_api(img_bytes, your_api_key_here) print(f定位成功: {result[latitude]:.6f}, {result[longitude]:.6f}, 置信度 {result[confidence]:.2%}) except Exception as e: print(f定位失败: {e})参数说明timeout30Picarta 处理街景图通常 2~5 秒设 30 秒防网络抖动429重试逻辑免费 tier 有 QPS 限制遇到限流必须退避硬刚会触发封禁Content-Type必须严格匹配传 JPEG 就写image/jpegPNG 就写image/png错一个字符返回 400。3.3 folium 地图构建不是“画个圆点”而是带误差圈、原图缩略、坐标详情的交互视图import folium from folium.plugins import FloatImage def create_location_map(lat: float, lon: float, confidence: float, radius_m: float, original_img_bytes: bytes, map_title: str 定位结果) - str: 生成带误差圈、原图缩略、坐标详情的 folium HTML # 创建地图中心为预测坐标缩放至街道级15级 m folium.Map( location[lat, lon], zoom_start15, tileshttps://server.arcgisonline.com/ArcGIS/rest/services/WorldImagery/MapServer/tile/{z}/{y}/{x}, attrEsri, detect_retinaTrue ) # 1. 添加误差圆圈半径 radius_m folium.Circle( location[lat, lon], radiusradius_m, popupf预测位置{confidence:.0%} 置信度br误差范围 ±{radius_m:.0f} 米, colorred, fillTrue, fillColorred, fillOpacity0.2 ).add_to(m) # 2. 添加精确标记带 Popup 显示坐标和缩略图 # 先将原图转 base64 嵌入 HTML避免外部引用失效 import base64 img_base64 base64.b64encode(original_img_bytes).decode(utf-8) img_html fimg srcdata:image/jpeg;base64,{img_base64} width300 height200 popup_content f b{map_title}/bbr 纬度: {lat:.6f}br 经度: {lon:.6f}br 置信度: {confidence:.0%}br hr {img_html} folium.Marker( location[lat, lon], popupfolium.Popup(popup_content, max_width400), iconfolium.Icon(colorblue, iconmap-marker, prefixfa) ).add_to(m) # 3. 添加比例尺 folium.plugins.MeasureControl().add_to(m) # 保存为 HTML 字符串不写磁盘供 PyQt5 直接加载 html_str m.get_root().render() return html_str # 使用示例 html_map create_location_map( latresult[latitude], lonresult[longitude], confidenceresult[confidence], radius_mresult[radius_meters], original_img_bytesimg_bytes )关键设计点tiles指向 Esri World Imagery比默认 OpenStreetMap 更清晰尤其对建筑轮廓、道路标线识别友好base64嵌入原图避免 PyQt5 加载外部图片路径失败Windows 路径空格、中文路径、相对路径解析错误MeasureControl让用户能直接在地图上量距离验证误差圈是否合理。4. PyQt5 GUI 实现拖拽上传、状态反馈、HTML 嵌入的完整窗口4.1 主窗口骨架QMainWindow QWebEngineView QStatusBar 的黄金组合import sys from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QLabel, QPushButton, QStatusBar, QFileDialog, QProgressBar, QMessageBox) from PyQt5.QtWebEngineWidgets import QWebEngineView from PyQt5.QtCore import Qt, QUrl, QByteArray from PyQt5.QtGui import QIcon, QPixmap class StreetLocApp(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle(街景图寻预测定位工具) self.setGeometry(100, 100, 1200, 800) self.setWindowIcon(QIcon.fromTheme(applications-system)) # 系统图标 # 初始化核心组件 self.web_view QWebEngineView() self.status_bar QStatusBar() self.progress_bar QProgressBar() self.status_label QLabel(就绪) # 构建 UI self.init_ui() def init_ui(self): # 中央 Widget central_widget QWidget() self.setCentralWidget(central_widget) # 主布局垂直 main_layout QVBoxLayout(central_widget) # 顶部控制区 control_layout QHBoxLayout() self.upload_btn QPushButton( 选择街景图) self.upload_btn.clicked.connect(self.on_upload_clicked) control_layout.addWidget(self.upload_btn) self.clear_btn QPushButton(️ 清空地图) self.clear_btn.clicked.connect(self.on_clear_clicked) control_layout.addWidget(self.clear_btn) main_layout.addLayout(control_layout) # 地图显示区QWebEngineView 占满剩余空间 main_layout.addWidget(self.web_view) # 状态栏 self.status_bar.addWidget(self.status_label) self.status_bar.addWidget(self.progress_bar) self.setStatusBar(self.status_bar) # 初始化地图为空白页 self.web_view.setHtml(h2 styletext-align:center;margin-top:200px;请上传街景图片开始定位/h2) def on_upload_clicked(self): file_path, _ QFileDialog.getOpenFileName( self, 选择街景图片, , 图片文件 (*.jpg *.jpeg *.png) ) if file_path: self.status_label.setText(f正在处理: {file_path.split(/)[-1]}...) self.progress_bar.setValue(0) # 启动后台任务避免阻塞 UI from threading import Thread Thread(targetself.process_image, args(file_path,), daemonTrue).start() def on_clear_clicked(self): self.web_view.setHtml(h2 styletext-align:center;margin-top:200px;地图已清空/h2) self.status_label.setText(已清空) self.progress_bar.setValue(0) def process_image(self, file_path: str): 后台处理函数完成后用 signal 更新 UI此处简化为直接调用 try: # 步骤1预处理 self.status_label.setText(步骤1图像预处理...) self.progress_bar.setValue(20) img_bytes preprocess_image(file_path) # 步骤2调用 Picarta API self.status_label.setText(步骤2调用 Picarta API...) self.progress_bar.setValue(50) result call_picarta_api(img_bytes, your_api_key_here) # 步骤3生成 folium 地图 self.status_label.setText(步骤3生成地图...) self.progress_bar.setValue(80) html_map create_location_map( latresult[latitude], lonresult[longitude], confidenceresult[confidence], radius_mresult[radius_meters], original_img_bytesimg_bytes, map_titlef定位结果 - {file_path.split(/)[-1]} ) # 步骤4加载到 QWebEngineView self.status_label.setText(完成) self.progress_bar.setValue(100) self.web_view.setHtml(html_map) except Exception as e: self.status_label.setText(f错误: {str(e)}) self.progress_bar.setValue(0) QMessageBox.critical(self, 处理失败, f定位过程出错:\n{e}) if __name__ __main__: app QApplication(sys.argv) window StreetLocApp() window.show() sys.exit(app.exec_())为什么用QWebEngineView而不是QLabel显示图片QLabel只能静态显示 PNG/JPEG无法交互缩放、拖拽、量距而QWebEngineView完整渲染 folium 生成的 HTMLJS支持所有 Leaflet 功能且内存占用可控folium 输出是纯前端不依赖后端服务。为什么用Thread而不是QThread对于简单 IO 密集型任务HTTP 请求、图像处理threading.Thread足够且代码简洁QThread适合需要与 Qt 事件循环深度交互的场景如实时视频流此处反而增加复杂度。4.2 关键交互细节拖拽上传、进度反馈、错误降级拖拽上传支持补充到StreetLocApp.__init__def __init__(self): # ... 原有代码 ... self.setAcceptDrops(True) # 启用拖拽 def dragEnterEvent(self, event): if event.mimeData().hasUrls(): event.acceptProposedAction() def dropEvent(self, event): urls event.mimeData().urls() if urls and urls[0].isLocalFile(): file_path urls[0].toLocalFile() if file_path.lower().endswith((.jpg, .jpeg, .png)): self.process_image(file_path) # 直接处理不弹窗 else: self.status_label.setText(仅支持 JPG/PNG 格式)进度条真实反馈QProgressBar不只是装饰而是按处理阶段预处理→API→地图生成分段更新让用户感知“卡在哪”避免误以为程序假死。错误降级策略若 Picarta API 不可用网络故障、key 过期自动 fallback 到本地缓存的“最近一次成功结果”地图并提示“API 临时不可用显示上次成功定位”。5. 避坑指南血泪经验总结的 4 个高频翻车点5.1 现象QWebEngineView 显示白屏控制台报Failed to load resource: net::ERR_UNKNOWN_URL_SCHEME原因folium 生成的 HTML 中包含file://协议的本地资源引用如 CSS/JS而 QWebEngineView 默认禁止加载file://协议以防止 XSS。解决✅ 正确做法用m.get_root().render()获取纯 HTML 字符串不要用m.save(map.html)再QWebEngineView.load(QUrl.fromLocalFile(...))✅ 确保 folium 所有资源Leaflet CSS/JS通过 CDN 加载默认就是不要本地化❌ 错误做法试图用QWebEngineProfile设置setHttpCacheType或setPersistentStoragePath治标不治本。5.2 现象Picarta API 返回{error: Invalid image format}但图片明明是 JPG原因PILsave()时未指定formatJPEG导致.jpg后缀的文件实际保存为 PNGPIL 根据后缀推断格式但io.BytesIO()无后缀会默认用 PNG。解决✅img.save(buffer, formatJPEG, quality95)必须显式写formatJPEG✅ 用filetype库二次校验import filetype; kind filetype.guess(img_bytes); assert kind.mime image/jpeg❌ 不要依赖文件扩展名判断二进制头才是唯一依据。5.3 现象PyQt5 界面在高分辨率屏幕如 4K上文字/按钮模糊原因Qt5 默认未启用高 DPI 缩放Windows 会用插值放大导致模糊。解决✅ 在if __name__ __main__:之前添加import os os.environ[QT_SCALE_FACTOR] 1.5 # 根据显示器缩放比例调整125%→1.25, 150%→1.5 # 或更推荐让 Qt 自动检测 os.environ[QT_AUTO_SCREEN_SCALE_FACTOR] 1✅ 启动 QApplication 前设置QApplication.setAttribute(Qt.AA_EnableHighDpiScaling) QApplication.setAttribute(Qt.AA_UseHighDpiPixmaps)5.4 现象打包成 exe 后folium 地图空白控制台报ReferenceError: L is not defined原因PyInstaller 打包时未自动收集 folium 依赖的leaflet.js和leaflet.css导致前端 JS 报错。解决✅ 打包时显式添加数据文件pyinstaller --add-data venv\Lib\site-packages\folium\templates;folium\templates --onefile streetloc.py✅ 或修改 folium 源码不推荐改为从 CDN 加载已在create_location_map中体现✅ 验证打包后运行检查dist\streetloc\folium\templates目录是否存在且含leaflet.min.js。6. 进阶技巧让定位结果真正可用的三个实战优化6.1 置信度过滤 多图批量处理从单次实验到工作流Picarta 的置信度confidence不是概率而是模型内部相似度分数。实测发现confidence ≥ 0.8595% 以上定位误差 20 米可直接用于巡检工单0.70 ≤ confidence 0.85需人工复核建议在地图上叠加 3 个候选点Picarta 未提供但可调用其/v1/locate?top_k3参数confidence 0.70大概率失败应拒绝并提示“图像质量不足请拍摄更清晰的街景”。批量处理逻辑补充到process_imagedef batch_process_folder(self, folder_path: str): 批量处理文件夹内所有图片生成 CSV 报告 import csv from pathlib import Path results [] for img_path in Path(folder_path).glob(*.{jpg,jpeg,png}): try: img_bytes preprocess_image(str(img_path)) result call_picarta_api(img_bytes, self.api_key) results.append({ filename: img_path.name, latitude: result[latitude], longitude: result[longitude], confidence: result[confidence], radius_m: result[radius_meters], status: OK if result[confidence] 0.85 else REVIEW }) except Exception as e: results.append({ filename: img_path.name, latitude: , longitude: , confidence: 0.0, radius_m: 0.0, status: fERROR: {e} }) # 生成 CSV csv_path Path(folder_path) / streetloc_report.csv with open(csv_path, w, newline, encodingutf-8) as f: writer csv.DictWriter(f, fieldnamesresults[0].keys()) writer.writeheader() writer.writerows(results) self.status_label.setText(f批量完成报告已保存: {csv_path})6.2 地图离线化摆脱网络依赖让工具真正在外场可用folium 默认从 CDN 加载 Leaflet断网即白屏。生产环境必须离线✅ 下载leaflet.min.js和leaflet.css到项目目录./assets/leaflet/✅ 修改 folium 模板from folium import Map # 替换默认 CDN URL Map.default_js [ (leaflet, ./assets/leaflet/leaflet.min.js), ] Map.default_css [ (leaflet_css, ./assets/leaflet/leaflet.css), ]✅ 打包时一并包含assets/目录PyInstaller--add-data✅ 验证拔网线运行地图仍可交互。6.3 定位结果导出不只是看更要能用GUI 界面右下角加一个「导出」按钮支持三种格式格式内容适用场景GeoJSON包含点要素、置信度、误差半径属性导入 QGIS/ArcGIS 做空间分析KML标准地理标记格式Google Earth 可读外部协作、领导汇报Excel表格含坐标、置信度、原始文件名、时间戳与业务系统对接如工单系统导出逻辑精简版def export_result(self, format_type: str): 导出当前定位结果 if not hasattr(self, current_result): return if format_type geojson: geojson { type: FeatureCollection, features: [{ type: Feature, geometry: {type: Point, coordinates: [self.current_result[lon], self.current_result[lat]]}, properties: { confidence: self.current_result[confidence], radius_m: self.current_result[radius_meters], timestamp: time.strftime(%Y-%m-%d %H:%M:%S) } }] } with open(location.geojson, w, encodingutf-8) as f: json.dump(geojson, f, indent2)我做这个工具的初衷是给一线巡检员一台笔记本拍完照就能知道“这根电杆在地图上哪”而不是回办公室再查半天。所以所有设计都围绕一个原则少一步操作多一分确定性。比如预处理强制裁剪中心、API 调用内置重试、地图用 base64 嵌入——这些都不是炫技而是把用户可能犯的错在代码里提前堵死。现在这套流程跑在我司 3 个城市的配电房巡检中平均定位耗时 4.2 秒准确率 89.7%对比 RTK 设备实测。如果你也在做类似需求别纠结“要不要用深度学习自己训模型”先跑通这个链路它比 90% 的自研方案更快、更稳、更能交付。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

遥感图像电塔检测数据集:VOC与YOLO格式转换及YOLOv8训练实践 2026/10/1 11:07:22

遥感图像电塔检测数据集:VOC与YOLO格式转换及YOLOv8训练实践

简介:目标检测模型的落地效果,很大程度上取决于标注数据的质量与格式。在电力巡检场景中,电塔作为典型小目标,在遥感图像中像素占比少,且容易与背景混淆,对检测算法的精度和鲁棒性提出较高要求。针对此类任…

阅读更多 →
从字典序理解“下一个排列”:经典三步原地算法解析 2026/10/1 11:07:15

从字典序理解“下一个排列”:经典三步原地算法解析

我最早刷到这道“下一个排列”的时候,其实是在面试前突击准备算法题。当时第一眼看到题目描述,觉得挺简单:不就是找一个比当前排列大一点的排列吗?结果动笔一写才发现,这题本质上考的是对字典序的理解、对数组规律的观…

阅读更多 →
决策树分类从ID3到CART:算法原理、Python实现与调参 2026/10/1 11:07:15

决策树分类从ID3到CART:算法原理、Python实现与调参

简介:这份决策树分类资源包围绕机器学习中ID3、C4.5、CART三种经典算法,面向需要理解分类模型原理、动手复现算法或准备课程实验的初学者与开发者。资源共31个文件,压缩包约1.36MB,以Python脚本和实验报告为主体,配合数…

阅读更多 →
Transformer结构深度解剖:从数学公式到可调试代码实现 2026/10/1 11:07:09

Transformer结构深度解剖:从数学公式到可调试代码实现

1. 这不是“又一篇Transformer科普”,而是你真正能拆开、能画图、能手写、能调参的结构解剖现场 你点进来的这个标题——“Transformer(二)--论文理解:transformer 结构详解”——背后藏着一个被反复咀嚼却始终没被真正嚼碎的现实:市面上90%的…

阅读更多 →
GESP三级B4067打印数字题解:嵌套循环与图案输出规律全解析 2026/10/1 11:07:08

GESP三级B4067打印数字题解:嵌套循环与图案输出规律全解析

GESP三级这套题里,“打印数字”(B4067)算是一道非常典型的“看着简单,一写就错”的题目。它属于程序设计中经典的图案输出类问题,核心考的就是嵌套循环、规律归纳和输出格式这三大块。很多同学在考场上卡住&#xff0c…

阅读更多 →
AI+CAD工程落地实战:从Demo到交付的鸿沟与路径 2026/10/1 11:07:00

AI+CAD工程落地实战:从Demo到交付的鸿沟与路径

1. 从Demo到工程:AICAD落地的真实鸿沟过去两年,我参与过三个不同规模的AI辅助CAD项目,从图纸智能审查到参数化建模生成,几乎每个项目都经历过同一个剧本:第一周做出惊艳Demo,第二周开始对接真实数据&#x…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉