[{"data":1,"prerenderedAt":482},["ShallowReactive",2],{"guide-code":3},{"id":4,"title":5,"body":6,"description":474,"extension":475,"meta":476,"navigation":477,"path":478,"seo":479,"stem":480,"__hash__":481},"guide\u002Fguide\u002Fcode.md","代码与脚本",{"type":7,"value":8,"toc":463},"minimark",[9,24,28,106,109,112,136,140,148,183,186,192,199,205,208,230,233,237,240,245,248,252,255,260,266,271,286,289,293,296,301,314,329,332,335,385,393,396,399,404,407,410,456,459],[10,11,12,13,18,19,23],"p",{},"代码与脚本是算青山的扩展能力，适合需要重复处理数据或维护小工具的用户。日常文字整理请看",[14,15,17],"a",{"href":16},"\u002Fguide\u002Ftext","文本与 Markdown","，Word 等格式请看",[14,20,22],{"href":21},"\u002Fguide\u002Fdocuments","文档处理","。",[25,26,27],"h2",{"id":27},"可以用来做什么",[29,30,31,47],"table",{},[32,33,34],"thead",{},[35,36,37,41,44],"tr",{},[38,39,40],"th",{},"任务",[38,42,43],{},"你提供什么",[38,45,46],{},"可以得到什么",[48,49,50,62,73,84,95],"tbody",{},[35,51,52,56,59],{},[53,54,55],"td",{},"理解已有脚本",[53,57,58],{},"脚本文件及用途",[53,60,61],{},"输入、输出、处理步骤和相关文件说明",[35,63,64,67,70],{},[53,65,66],{},"检查调查数据",[53,68,69],{},"小份样例与明确规则",[53,71,72],{},"可审阅的脚本、运行记录和问题清单",[35,74,75,78,81],{},[53,76,77],{},"修改处理逻辑",[53,79,80],{},"当前行为与预期结果",[53,82,83],{},"指定范围的代码修改及验证说明",[35,85,86,89,92],{},[53,87,88],{},"编写 QGIS 脚本",[53,90,91],{},"林班、巡护路线和处理规则",[53,93,94],{},"PyQGIS 脚本与运行说明",[35,96,97,100,103],{},[53,98,99],{},"编写 ArcGIS 脚本",[53,101,102],{},"小班、作业范围和统计口径",[53,104,105],{},"ArcGIS Pro ArcPy 脚本与核对步骤",[10,107,108],{},"应用可通过工具读取、搜索和修改受支持的文本文件，并在桌面端获准后运行命令。运行 Python 等脚本需要本机具备相应环境；生成代码不代表已安装解释器或依赖。",[25,110,111],{"id":111},"开始前",[113,114,115,119,130,133],"ol",{},[116,117,118],"li",{},"打开项目，放入脚本或用于验证的小份数据副本。",[116,120,121,125,126,23],{},[14,122,124],{"href":123},"\u002Fguide\u002Fmodels#%E9%85%8D%E7%BD%AE%E8%81%8A%E5%A4%A9%E6%A8%A1%E5%9E%8B","配置聊天模型","，选择允许工具执行的",[14,127,129],{"href":128},"\u002Fguide\u002Fpermissions","授权方式",[116,131,132],{},"说明输入文件、处理规则、输出文件名和允许修改的范围。",[116,134,135],{},"需要运行时，让助手先检查本机环境，再按当前授权执行。",[25,137,139],{"id":138},"示例一检查巡护记录中的缺项与重复编号","示例一：检查巡护记录中的缺项与重复编号",[10,141,142,143,147],{},"准备 UTF-8 编码的 ",[144,145,146],"code",{},"巡护记录.csv","，以下均为虚构数据，只用于演示字段检查。",[149,150,155],"pre",{"className":151,"code":152,"language":153,"meta":154,"style":154},"language-csv shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","记录编号,地块编号,巡护日期\nR001,QL-01,2026-09-01\nR002,QL-02,\nR002,QL-03,2026-09-02\n","csv","",[144,156,157,165,171,177],{"__ignoreMap":154},[158,159,162],"span",{"class":160,"line":161},"line",1,[158,163,164],{},"记录编号,地块编号,巡护日期\n",[158,166,168],{"class":160,"line":167},2,[158,169,170],{},"R001,QL-01,2026-09-01\n",[158,172,174],{"class":160,"line":173},3,[158,175,176],{},"R002,QL-02,\n",[158,178,180],{"class":160,"line":179},4,[158,181,182],{},"R002,QL-03,2026-09-02\n",[10,184,185],{},"向助手发送：",[187,188,189],"blockquote",{},[10,190,191],{},"读取巡护记录.csv，创建 check_records.py，只使用 Python 标准库。检查“记录编号、地块编号、巡护日期”是否为空，以及记录编号是否重复。将问题保存到检查结果.csv，包含原 CSV 行号、记录编号和问题说明，表头计为第 1 行；重复编号要列出全部相关行。不要修改原文件，不要补填缺失信息。先说明逻辑并检查本机 Python 环境，在授权允许后用样例运行，报告实际输出和退出结果。已有同名输出文件时先说明再处理。",[10,193,194],{},[195,196],"img",{"alt":197,"src":198},"脚本检查概念图：巡护记录经缺项与重复规则检查，输出第3行缺少日期、第3和4行编号重复","\u002Fimages\u002Fguides\u002Fcode-record-check.svg",[10,200,201],{},[202,203,204],"em",{},"概念示意，展示样例的预期检查结果；不是产品截图或实际运行记录。",[10,206,207],{},"你应核对以下结果：",[209,210,211,218,224,227],"ul",{},[116,212,213,214,217],{},"第 3 行 ",[144,215,216],{},"R002"," 缺少巡护日期。",[116,219,220,221,223],{},"第 3、4 行的记录编号 ",[144,222,216],{}," 重复，两个相关行都应列出。",[116,225,226],{},"原 CSV 内容未被改写，检查脚本和结果文件已保存。",[116,228,229],{},"运行记录中有实际执行结果；“脚本已生成”不等于“检查已完成”。",[10,231,232],{},"这份示例只检查空值与重复，不判断日期是否合法、地块是否真实、巡护是否完成。增加规则前，应先确定规则与例外。",[25,234,236],{"id":235},"示例二给现有脚本增加一个检查条件","示例二：给现有脚本增加一个检查条件",[10,238,239],{},"完成前一个示例后，可以继续提出一个有限的改动：",[187,241,242],{},[10,243,244],{},"在 check_records.py 中增加“巡护日期必须是有效的 YYYY-MM-DD 日期”的检查，保留原来的缺项和重复编号规则。只修改该脚本。另建测试样例，分别包含正常日期、空日期、2026\u002F09\u002F01 和 2026-02-30；空日期只报缺项，其余无效日期报告格式或日期错误。运行验证并说明修改位置、实际结果和未能验证的部分，不覆盖巡护记录.csv。",[10,246,247],{},"审阅时把“改了什么”和“验证了什么”一起看：正常日期应通过，空值不重复报错，错误格式和不存在的日期应被识别。小样例通过后，再对业务数据副本运行，并抽查输出。",[25,249,251],{"id":250},"示例三用-qgis-脚本筛选巡护路线周边的小班","示例三：用 QGIS 脚本筛选巡护路线周边的小班",[10,253,254],{},"想安排沿线巡护时，可以让助手编写 PyQGIS 脚本，筛选路线周边需要关注的小班。准备巡护路线线图层、小班面图层，以及小班唯一编号字段。Shapefile 应保留配套文件；使用 GeoPackage 时说明图层名。",[187,256,257],{},[10,258,259],{},"请为我的 QGIS 编写 route_stands.py，用于在 QGIS Python 控制台的编辑器中运行。输入巡护路线和林业小班图层，以路线周边 100 米缓冲区筛选相交的小班，输出完整小班到新的 GeoPackage，并生成小班编号清单 CSV。100 米只是本次演示参数，请做成可修改变量。先向我确认 QGIS 版本、图层路径、图层名、小班编号字段和适合当地的米制投影坐标系；不得猜测未知坐标系。缓冲区先融合，再按唯一编号去重；输出保留完整小班，不裁切小班边界。检查空几何、无效几何和编号缺失，遇到问题先报告。保留源文件，附运行方法与核对步骤，未运行时明确说明。",[10,261,262],{},[195,263],{"alt":264,"src":265},"林业 GIS 脚本概念图：巡护路线与小班通过 QGIS 筛选沿线小班，作业范围与小班通过 ArcGIS 统计重叠面积","\u002Fimages\u002Fguides\u002Fcode-forestry-gis.svg",[10,267,268],{},[202,269,270],{},"概念示意，不是实际地图或分析结果。缓冲距离由业务人员确定；与缓冲区相交不代表该小班已完成巡护。",[10,272,273,274,280,281,23],{},"**如何使用：**先安装 QGIS，打开项目，在 Python 控制台的编辑器中审阅脚本、填写参数，再用少量数据运行。若要从算青山执行独立 PyQGIS 脚本，需要另行配置 QGIS 库、资源路径及 Processing 环境，不能直接假定普通 Python 可用。",[14,275,279],{"href":276,"rel":277},"https:\u002F\u002Fdocs.qgis.org\u002F3.44\u002Fen\u002Fdocs\u002Fpyqgis_developer_cookbook\u002Fintro.html",[278],"nofollow","QGIS Python 环境说明","、",[14,282,285],{"href":283,"rel":284},"https:\u002F\u002Fdoc.qgis.org\u002F3.44\u002Fen\u002Fdocs\u002Fuser_manual\u002Fprocessing\u002Fconsole.html",[278],"Processing 控制台指南",[10,287,288],{},"**如何核对：**在 QGIS 中叠加路线、缓冲区和输出小班，抽查缓冲区内外及边缘相交的小班；检查编号去重、输出数量和坐标系。距离计算应使用经确认的坐标系与单位，不能把经纬度的“度”当作“米”。",[25,290,292],{"id":291},"示例四用-arcgis-脚本统计作业范围涉及的小班面积","示例四：用 ArcGIS 脚本统计作业范围涉及的小班面积",[10,294,295],{},"准备拟作业范围面图层、林业小班面图层，以及小班编号和林种字段。目标是生成“哪些小班与作业范围重叠、重叠面积多少”的统计初稿，供经办人员核对。",[187,297,298],{},[10,299,300],{},"请为 ArcGIS Pro 编写 stand_overlap.py，使用 ArcPy。将拟作业范围与林业小班进行面相交，重新计算相交部分的面积，按小班编号和林种汇总公顷数，保存相交要素和统计表到新的文件地理数据库。先确认 ArcGIS Pro 版本、输入路径、字段名、坐标系、面积计算方法和软件许可。检查无效几何及范围内重叠，说明如何避免重复计面积；不要擅自合并或修复源数据。不要直接汇总源小班的整块面积字段。保留原件，附参数说明、运行步骤、日志和抽样验证方法。没有 ArcGIS 环境时只交付脚本与待验证说明。",[10,302,303,304,307,308,313],{},"**如何使用：**本例面向 ArcGIS Pro 的 Python 3 \u002F ArcPy 环境。可在 Pro 的 Python 窗口或 Notebook 中执行经审阅的代码，也可使用其 Python 环境运行 ",[144,305,306],{},".py"," 文件；独立执行还需满足许可条件。普通 Python 安装不等于拥有 ArcPy 环境。详见 ",[14,309,312],{"href":310,"rel":311},"https:\u002F\u002Fpro.arcgis.com\u002Fen\u002Fpro-app\u002Flatest\u002Farcpy\u002Fget-started\u002Finstalling-python-for-arcgis-pro.htm",[278],"ArcGIS Pro Python 与运行环境","。旧版 ArcMap 脚本需要说明版本并单独适配。",[10,315,316,317,322,323,328],{},"实现时可以按数据条件选用 ",[14,318,321],{"href":319,"rel":320},"https:\u002F\u002Fpro.arcgis.com\u002Fen\u002Fpro-app\u002Flatest\u002Ftool-reference\u002Fanalysis\u002Fpairwise-intersect.htm",[278],"Pairwise Intersect（成对相交）"," 和 ",[14,324,327],{"href":325,"rel":326},"https:\u002F\u002Fdoc.esri.com\u002Fen\u002Farcgis-pro\u002Flatest\u002Ftool-reference\u002Fanalysis\u002Fsummary-statistics.html",[278],"Summary Statistics（汇总统计）","。具体工具、参数和许可应按用户安装版本核对。",[10,330,331],{},"**如何核对：**抽取几个小班，在 ArcGIS Pro 中对照相交几何和面积；检查面积单位、重复叠加、空林种及未匹配记录。对于无内部重叠的数据，同一小班的汇总相交面积不应超过其整块面积。统计结果用于资料整理，不自动形成采伐许可、用地认定或正式调查结论。",[25,333,334],{"id":334},"还可以提出哪些林业脚本需求",[29,336,337,350],{},[32,338,339],{},[35,340,341,344,347],{},[38,342,343],{},"场景",[38,345,346],{},"给助手的关键信息",[38,348,349],{},"预期交付",[48,351,352,363,374],{},[35,353,354,357,360],{},[53,355,356],{},"按乡镇或林班批量拆分图层",[53,358,359],{},"分组字段、命名规则、输出格式",[53,361,362],{},"拆分脚本、文件清单与数量核对",[35,364,365,368,371],{},[53,366,367],{},"关联样地调查表与样地点",[53,369,370],{},"唯一编号、重复记录处理规则",[53,372,373],{},"关联脚本、未匹配与重复编号清单",[35,375,376,379,382],{},[53,377,378],{},"批量输出小班示意图",[53,380,381],{},"已有布局模板、范围、比例尺与命名规则",[53,383,384],{},"对应 GIS 软件的制图脚本与样图核对步骤",[10,386,387,388,392],{},"算青山协助编写、解释和修改脚本；空间处理由配置好的 QGIS 或 ArcGIS 环境执行。文中示例尚未在你的 GIS 环境和业务数据上运行。算青山软件自身免费，ArcGIS 软件许可等第三方费用另计；原生",[14,389,391],{"href":390},"\u002Fguide\u002Fmaps","地图查看功能","与这些外部脚本流程分别使用。",[25,394,395],{"id":395},"先读懂别人写的脚本",[10,397,398],{},"不确定现有工具是否合适时，可以先只读分析：",[187,400,401],{},[10,402,403],{},"阅读 check_records.py，说明读取哪些文件、写到哪里、检查哪些字段，是否会覆盖已有文件或访问网络。给出相关代码位置，暂不修改或运行。",[10,405,406],{},"对于较大的项目，应指定目录或功能。发现输入格式不一致时，先说明差异再修改。",[25,408,409],{"id":409},"检查与常见问题",[29,411,412,422],{},[32,413,414],{},[35,415,416,419],{},[38,417,418],{},"情况",[38,420,421],{},"下一步",[48,423,424,432,440,448],{},[35,425,426,429],{},[53,427,428],{},"找不到 Python 或所需依赖",[53,430,431],{},"检查本机安装与可执行路径；不能把未运行标记为通过",[35,433,434,437],{},[53,435,436],{},"中文乱码、字段找不到",[53,438,439],{},"核对编码、分隔符和实际表头，再用小样例重试",[35,441,442,445],{},[53,443,444],{},"运行成功但结果不符合预期",[53,446,447],{},"对照原始行和规则抽查；退出成功不代表业务判断正确",[35,449,450,453],{},[53,451,452],{},"修改时提示文件已变化",[53,454,455],{},"重新读取当前文件再应用修改，避免使用过期内容",[10,457,458],{},"脚本处理受平台、权限和本机环境约束。命令执行目前面向桌面端；这些示例不代表软件内置了专业林业分析或自动业务审查。",[460,461,462],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":154,"searchDepth":167,"depth":167,"links":464},[465,466,467,468,469,470,471,472,473],{"id":27,"depth":167,"text":27},{"id":111,"depth":167,"text":111},{"id":138,"depth":167,"text":139},{"id":235,"depth":167,"text":236},{"id":250,"depth":167,"text":251},{"id":291,"depth":167,"text":292},{"id":334,"depth":167,"text":334},{"id":395,"depth":167,"text":395},{"id":409,"depth":167,"text":409},"从巡护记录检查到 QGIS、ArcGIS 林业脚本，学习编写、修改和验证数据处理工具。","md",{},true,"\u002Fguide\u002Fcode",{"title":5,"description":474},"guide\u002Fcode","J_a9Q_OQfmQWXvFRwEjpI1B9RfFcF55tbtNQCe60IIo",1794541724037]