简介本资源是一套基于ArcGIS 10.1/10.2平台开展学校选址空间分析的完整实践案例面向地理信息系统初学者、城乡规划专业学生及GIS应用从业者解决公共服务设施选址中的多因子叠加分析、缓冲区评估与适宜性制图等核心问题。压缩包共77个文件包含shp矢量数据、img栅格底图、mdb地理数据库、mxd工程文档及配套dbf属性表、xml元数据等全面覆盖数据准备、空间处理、权重赋值、叠加运算到成果出图的全流程产出物总大小仅642KB轻量易用。已有1087人学习下载资源结构清晰分为“实验材料”与“成品成果”两大模块含ex09标准实验工程、学校选址.mdb数据库、多个中间分析图层如c_3/c_5/c_15等及最终可视化成果图.mxd可直接加载运行、逆向推演操作逻辑是理解GIS选址模型构建与ArcGIS经典工作流的优质参考范例。 学校选址这种项目估计每个用ArcGIS做过规划分析的人都躲不开。文件名里带个“.zip”要么是别人打包发来的练习数据要么是自己项目要归档交付了。不管哪种情况选址背后那套“多因子加权叠加”的思路才是真正值钱的东西。这篇文章我就拿这个学校选址场景把ArcGIS里从数据准备、因子分析到模型构建、出图的完整流程从头到尾拆一遍顺便把那些装软件、坐标系对不上、模型跑得慢之类的坑也一起填了。1. 学校选址项目的整体设计逻辑先想清楚再动手1.1 学校选址到底在解决什么问题先说一个我实际接触过的需求某城区要新建一所小学规划部门提供了几块候选用地但都不能拍板因为“位置好不好”不是嘴上说了算的。什么叫好离学生居住区近、交通方便、地势平坦、周边没有污染源、不和现有学校距离太近。这些条件单独看每块地好像都占几条但到底哪块综合分最高判断起来就很主观。ArcGIS在这个场景里干的事本质上是把“位置好不好”这个模糊问题拆成一组可以用数据衡量的指标再按照一定权重合并成一张“适宜性得分图”最后用栅格计算和空间分析把最优区域圈出来。这个思路不仅适用学校医院、垃圾转运站、物流园区、充电桩选址原理一模一样。对刚接触GIS的人而言这类项目最好的地方在于它把缓冲区、欧氏距离、重分类、栅格计算器、加权叠加这些工具串成了一条完整的业务线。做完一遍你对ArcGIS的分析框架基本就有底了。1.2 因子选取与数据准备从业务需求到图层映射选址分析的第一步不是打开ArcGIS而是把需求翻译成数据。学校选址里我一般会分出三类因子限制性因子、偏好性因子、加分项。限制性因子比如基本农田、生态红线、地质灾害易发区这些地方直接不能建属于“一票否决”。偏好性因子比如距离主干道路的距离、地形坡度、距离现状学校的距离、周边居住区密度。加分项比如距离公园绿地近、周边公共服务配套完善。实际操作中我常用的数据集长这样因子数据来源原始格式处理要点地形坡度DEM数字高程模型栅格填洼后提取坡度按3度一档重分类道路通达性路网矢量数据线要素用欧氏距离工具生成距离栅格现状学校分布教育设施POI点要素先做缓冲再做距离栅格居住区分布土地利用现状面要素转栅格后做核密度或距离分析污染源/工业用地环保、规划数据面要素设置禁止缓冲区作为限制条件水系/高压走廊水利、电力部门线要素缓冲后作为避让区域数据齐了以后最关键的一步也是新手特别容易忽略的一步把所有数据统一到一个坐标系下。我习惯用CGCS2000 3度分带的投影坐标系因为后续做距离分析时单位是米算出来才是真实世界距离。如果直接用地理坐标系经纬度欧氏距离计算出来的结果不是以米为单位的会直接影响评分。1.3 为什么要用加权叠加而不是“一票否决”有的同学会问我直接把不合格的区域擦除Erase掉剩下的不就是可建地块了吗这样做当然可以但它只能回答“哪里可以建”回答不了“哪里最该建”。多个备选地块都满足硬性条件时怎么择优这时候就需要加权叠加。举个例子你马上就能懂买房的时候你可能要求“总价低于300万、离地铁2公里内、面积不小于90平”这是硬性筛选但最后在两个符合条件的小区里纠结你一定会权衡“学校近不近、生活方不方便、小区环境好不好”这就是加权打分。选址分析完全是同一个逻辑。ArcGIS里的加权叠加就是把每个因子栅格重分类到同一个分值范围比如1到10然后乘以各自的权重累加到一张总得分栅格上。这样既保留了“避让”的硬约束又能把模糊的“偏好”量化成可比较的数值。多准则决策分析这个词听起来很高端剥开就是这套东西。2. 核心原理与关键算法为什么这样算、这样跑2.1 重分类把不同量纲统一成一把尺子重分类Reclassify是选址分析里最简单的工具也是最容易被敷衍过去的工具。为什么需要它因为你的原始因子数据量纲完全不同坡度是度数0到50多度距离是米0到几万米人口密度是人每平方公里。这些数值混在一起直接相加等于拿厘米和公斤相加毫无意义。重分类的作用就是把这些乱七八糟的量纲统一折算到同一个评分体系。我常用的分级是10分制。比如坡度0度到3度给10分3度到6度给8分6度到10度给6分10度以上给3分。距离主干道路500米以内给10分500到1000米给8分1000到1500米给6分超过1500米给4分——太近了反而不行学校门口开大马路安全性和噪音都是问题所以距离太近也要适当扣分。这个评分标准看起来简单其实非常考验对业务的理解。给甲方做项目时评分表一般要跟他们过一遍因为权重和评分标准本质上就是“政策的数学化”。我在实操中会先把评分标准做成Excel表发给甲方确认签字之后再进ArcGIS避免后期改来改去。ArcGIS里重分类的操作就是右键点栅格图层打开Spatial Analyst工具选Reclassify设置好新旧值对应关系。注意一点重分类之前最好确认栅格有没有NoData区域有的话在分类表里把NoData单独设一个低分值否则后面叠加时会出现大片空值区。2.2 权重从哪来层次分析法帮你摆脱拍脑袋权重是整个叠加分析里争议最大的环节。同一个项目换个专家来打分权重可能完全不一样。我见过不少项目权重就是项目负责人拍脑袋定的说实话这样也能出结果但汇报的时候很容易被质疑。比较正规的做法是用层次分析法AHP。它的核心思路不是直接问“你觉得交通重要还是地形重要”而是让专家两两比较交通相对地形重要多少用1到9的标度打分。把所有两两比较结果填进一个判断矩阵然后计算矩阵的特征向量归一化之后就是一组权重。这个过程用Excel就能算不需要装额外的软件。以学校选址为例我当时和几个规划师讨论后取到的权重大概是这样的因子权重说明与居住区距离0.30生源是关键离居住区越近越方便与主干道路距离0.20通达性影响接送和校车路线地形坡度0.20影响建设成本和场地安全与污染源距离0.15环境安全硬指标与现状学校距离0.15避免服务半径重叠均衡布局这组权重加起来等于1后续加权叠加时可以直接用。如果不是1ArcGIS的加权叠加工具也会自动归一化但我习惯提前算好心里有数。要特别说的是权重不是一成不变的。你在A区做学校和B区做学校人口密度、路网条件都不一样权重需要跟着调。这也是为什么我建议把整个流程做成模型第3章会讲因为数据一变、权重一变重跑一次模型就有新结果效率完全不一样。2.3 加权叠加的数学本质栅格计算器里的加减乘除加权叠加的数学表达式其实特别简单就是每个重分类栅格乘以它对应的权重再全部相加适宜性得分 0.30 × 居住区距离评分 0.20 × 道路距离评分 0.20 × 坡度评分 0.15 × 污染源距离评分 0.15 × 现状学校距离评分这个公式可以直接写进ArcGIS的栅格计算器Raster Calculator里一行搞定0.30 * Reclass_Residence 0.20 * Reclass_Road 0.20 * Reclass_Slope 0.15 * Reclass_Pollution 0.15 * Reclass_School不过ArcGIS里还提供了两个专门的工具一个是“加权总和”Weighted Sum一个是“加权叠加”Weighted Overlay。两者的区别在于加权总和直接对各输入栅格乘以权重后相加不要求输入栅格是整数加权叠加则要求所有输入栅格都是整数而且必须在同一个重分类分级体系下比如都是1到10它内部还会做一次归一化。我用得更多的是加权叠加因为它自带一个友好的权重面板甲方看着也直观。操作上还有必须注意的一点所有参与叠加的栅格范围、像元大小、投影必须完全一致。经常有同学说“我两个图层坐标系明明一样但叠加出来就是错位的”多数就是忽略了栅格分析环境里的“像元大小”“捕捉栅格”设置。这一点很关键我到第4章的常见问题里再展开。3. 实操过程从零搭一套学校选址分析流程3.1 一开始就把工程规范起来建库、定坐标、设环境打开ArcMap之后我建议先别急着拖数据花五分钟把“工程底盘”打好。第一步在目录面板里新建一个文件地理数据库File Geodatabase所有中间结果都放这个库里。为什么不直接用shapefile因为shapefile单个文件只能存一种几何类型字段名还可能被截断而且处理大量中间栅格时效率明显不如GDB。第二步把所有矢量数据统一投影到CGCS2000的投影坐标系或者根据需要选择Albers等积圆锥投影。注意做距离分析时优先用等距/等积特性的投影坐标单位是米。如果你拿到的原始数据是WGS84经纬度直接做欧氏距离结果就是错误的。第三步设置栅格分析环境。这一步90%的新手都会忽略等结果出来才发现不对。在ArcMap菜单栏里选择“地理处理”-“环境”把以下三项设好环境参数推荐设置为什么要这样设当前工作空间刚才建的GDB中间结果不会散落一地像元大小30米或原DEM一致所有输出栅格统一规格分析掩膜研究区边界只算研究区防止边缘外溢捕捉栅格已有的一份基准栅格确保所有结果像素网格对齐这里的“捕捉栅格”是解决“两组栅格不吻合”的利器。你选一份基准栅格比如处理好的DEM作为捕捉栅格后续所有栅格运算都会自动对齐到它的网格。这个操作不用写一行代码纯界面设置。3.2 逐步构建因子栅格从矢量到评分的完整链路数据底盘打好了接下来就是逐个生成因子栅格。我先拿坡度因子演示完整流程第一步用“填洼”Fill工具处理DEM把地形里的洼地填平防止后续水文分析出现断流这里做坡度分析其实影响不大但我习惯数据链路统一所以顺手做了。第二步用“坡度”Slope工具从填洼后的DEM提取坡度单位选度Degree。得到的是原始的坡度栅格数值从0到几十度量纲还不是评分。第三步用“重分类”Reclassify把坡度栅格映射到1到10的评分。操作时点开Reclassify工具在“重分类表”里设置分级阈值。我用的经验标准是0到3度103到6度86到10度610到15度315度以上1。NoData给NoData或者最低分一定不能保留成NoData否则后续叠加会算成空值。道路通达性因子用类似思路只是把“坡度”换成“欧氏距离”Euclidean Distance。输入路网矢量线工具自动生成一个每个像元到最近道路的距离栅格。得到距离栅格后再重分类。这里有个细节值得注意欧氏距离生成出来的距离是直线距离如果研究区有山脉、河流阻隔直线距离不一定等于实际出行距离。更精细的做法是用成本距离Cost Distance把道路等级、地形、河流桥梁都折算成通行成本。但对于学校选址这个精度的项目欧氏距离在初步筛选阶段完全够用不用为了炫技把流程搞复杂。居住区、现有学校、污染源这些点/面数据的处理逻辑也是一样的要素转栅格或直接算欧氏距离再重分类。等五个因子栅格都生成好一定要看一眼它们的属性表确认像元大小一致、范围一致、最小值最大值在1到10区间内。我在项目里这一步吃过亏五个栅格三个范围不一致叠加结果边缘直接缺了一块。3.3 用模型构建器把流程固化换数据一键重跑如果你只是临时做一次分析上面步骤手工点一遍也能出结果。但如果是给别人做项目或者要反复调权重、换区域手工点容易出错而且效率极低。这时候就轮到模型构建器Model Builder出场了。模型构建器的本质就是把刚才那些工具按顺序串起来做成一个自动化流程。我把这个学校选址模型拆成四段输入数据段、因子分析段、重分类段、加权叠加段。创建步骤很简单在GDB里新建一个工具箱右键工具箱选择“新建”-“模型”。打开模型编辑器从目录里把数据拖进画布再拖入工具用“连接”箭头把前后接上。中间参数双击设置好保存。模型里我会设置几个模型参数把数据设为参数这样每次换数据时只需要双击模型在弹窗里替换输入文件模型会自动跑完全流程输出新的适宜性得分图。还有一个小技巧每个工具的输出最好先点击右键把中间栅格属性设为“中间数据”中间数据跑完后可以选择删除避免模型把一个项目目录堆满临时文件。有的同学问“模型构建器怎么越跑越慢”很大一个原因就是中间过程文件太多磁盘读写占用上来了第4章我会细说。3.4 结果分级与候选地块圈定从连续得分到可落地图斑加权叠加跑完后得到的是一张连续分值栅格比如从1到10的浮点型数值。要把它变成可用的选址结论还需要做两步分级和矢量化。分级用“重分类”把综合得分切成四档不适宜1到4分、低适宜4到6分、中适宜6到8分、高适宜8到10分。这样栅格图就变成了一幅清晰的“四色图”汇报时非常直观。接下来把“高适宜”这一档单独提取出来用“栅格转面”Raster to Polygon工具转成矢量面。转成面之后还要做几个收尾操作第一用“消除”Eliminate或者“聚合面”把碎小图斑合并避免一块几十平方米的碎片被当成选址地块。我一般会加一个面积阈值比如小于2公顷的地块直接剔除这块面积就是学校用地的下限。第二把限制性因子叠加进来做“擦除”。比如把基本农田、生态红线、地质灾害区这些区域从高适宜地块里剪掉。第三把候选地块按综合得分排序导出属性表生成一份“地块推荐次序表”。我之前给甲方汇报时就靠这张表加几张实景地图截图基本一次通过。到这里学校选址的定性结论就出来了哪些地方最合适哪些地方次之哪些绝对不能碰每个候选地块为啥合适都能在图上找到依据。4. 常见问题与排查技巧实录都是真实踩过的坑4.1 环境与授权问题装好了为什么还是跑不起来学校选址流程里用到的是Spatial Analyst扩展模块。如果你打开工具时提示类似“you are not licensed for arcgis for desktop advanced”或者工具灰色不可点多半不是软件没装好而是许可没激活。常见原因有这么几种安装时只装了ArcInfo许可等级却用ArcView等级在跑或者安装软件后没有勾选相应扩展模块。解决办法也很简单打开“自定义”菜单下的“扩展模块”Extensions把“Spatial Analyst”勾上。如果是许可等级的问题在桌面软件的“关于”里查看当前许可等级切到AdvancedArcInfo再重试。要是换了好几台机器都遇到同样的授权报错那就是安装包里的许可管理器配置问题需要针对许可证服务器重新设置。还有一个情况如果你装的版本太老比如ArcGIS 10.2.2在Windows 10以上系统里容易出兼容性问题。我后来基本都是用10.8或者直接上ArcGIS Pro。Pro的界面上手要适应一阵但处理栅格大数据的性能的确好太多。下载安装的时候注意一个坑Pro安装包体积很大安装过程中必须完整解压再运行直接双击压缩包里的exe经常失败。4.2 两组栅格数据不吻合、像元不对齐怎么办这是选址项目里最让人抓狂的问题之一。明明两个图层坐标系统一成了同一个投影坐标系为什么叠加结果还是错位其实“坐标系一致”不等于“栅格网格一致”。两个栅格即使坐标系相同、范围相同只要创建时的像元大小或像元对齐方式稍有不同叠在一起就是错开的。解决的办法不需要写代码核心就两个步骤第一设置栅格分析环境里的“捕捉栅格”选一个基准栅格比如从一开始就固定用处理过的DEM。这样一来后面所有派生栅格在生成时都会对齐到基准栅格的网格。第二在“环境”里把“栅格分析”的像元大小设为和基准栅格完全一致。如果原始数据分辨率不同比如路网转栅格用的像元大小和DEM不一样通过这一步统一。处理完再重新跑一遍重分类和叠加两张栅格就严丝合缝了。这个问题在重分类阶段就要处理好否则叠加结果边缘会出现锯齿状错位最后导出的图肯定没法看。栅格数据没有吻合这类问题多半都是这一步没做对。4.3 模型构建器为什么越跑越慢一个被忽略的性能陷阱明明输入的只是一个小县城范围的数据模型构建器却越跑越慢跑一次要十几分钟甚至更久。我在实际项目里排查过几次问题基本出在这几处一是模型里的中间数据被保留为“永久数据”而不是“中间数据”。每次运行模型都会把这些结果写进数据库如果模型里循环了很多轮数据库里积累了一堆大文件磁盘I/O压力直接拖垮性能。二是在模型里加入了显示操作。模型构建器运行时如果你开启了“显示中间数据”的选项它每算完一个工具就会强制刷新地图显示这个最耗时间。解决办法是把模型里各工具的输出右键属性里都勾成“未添加到显示”一次性跑完再看结果。三是缓冲区、欧氏距离这类工具本身计算量就大。如果研究区范围太大可以先裁剪到研究区再算没必要对整个城市范围做高分辨率的欧氏距离。我在模型里一般会有一步“按掩膜提取”把所有分析范围约束在选址研究区内。很多项目其实用不上脚本单纯的模型构建器优化之后性能完全可以接受。只有数据量到了全省、全国这种级别才需要考虑Python脚本或者把中间过程拆到多台机器并行。4.4 成果导出、专题地图和批量出图的小技巧选址分析做完最后一步是要出图的。ArcGIS制图本身是个大话题我只挑和学校选址这个场景最相关的几个点讲讲。一个是专题图的表达。适宜性分级图建议用绿色到红色的渐进色系来表达高适宜绿色、低适宜红色这符合大多数人的直觉。叠加要素的时候先把候选地块用加粗边框突出次级区域透明度调低这样主次分明。另一个是字段标注。我在标注候选地块编号时经常会用到表达式。如果要在图上标一个“面积地块编号”两行文本可以直接在标注表达式里写D [字段ID] vbCrLf Round([面积], 0) 平方米这行VB脚本的意思是把地块编号和面积拼在一起换行显示。ArcGIS标注表达式的语法是VB不是Python注意别用错了。还有一个比较实用的需求把成果批量导成KML方便在Google Earth三维地形里查看。ArcGIS里有“图层转KML”工具但它一次只能转一个图层。如果要转多个要素类可以用模型构建器做一个循环迭代要素类把它们全部转出来原理就是给“图层转KML”外面套一个迭代器。这个方法我在做规划汇报时用得非常多兄弟们可以复制这个思路换成别的批量导出也一样能跑。之前有学生问“ArcGIS里怎么给地名标四角坐标、上下标”其实也是表达式的活。比如标注分子分母结构的地层代号表达式里用“”和“”HTML标记就能实现。ArcGIS标注系统支持部分HTML标签这是一个比较冷门但很实用的技巧。说到文件编码问题还有一个小坑从别的机器拷过来的MXD工程文件打开后发现属性表里的中文都乱码了。这通常不是数据本身坏了而是工程文件里用的字符编码和当前系统不一致。解决办法是在“ArcMap选项”的“常规”标签里勾选“使用系统区域设置”然后重启软件重新打开工程。我在多个版本、多台电脑之间来回拷项目时这个坑踩过不止一次。最后的几句大实话这套学校选址流程看起来就是一连串工具命令但真正决定项目质量的是你对自己业务逻辑的拆解能力。ArcGIS只是把你“脑子里怎么想选址”这个判断过程翻译成了一张可以反复推敲、随时修改的运算模型。模型建好之后换城市、换指标、换权重都是一次重跑的事这才是GIS分析真正值钱的地方。另外一个过来人的体会做这类项目前期花在数据收集和清洗上的时间往往比正式做分析的时间还长。如果拿到一套坐标系混乱、字段命名不规范的数据千万别急着动手先把数据整理规范了再跑不然返工的成本足够让人崩溃。数据质量决定了分析结果的上限工具只是帮你把这个上限稳定地兑现出来。最后再分享一个小习惯我会把每一版权重和评分标准都存在模型的一个同名字段里或者直接在模型说明里写清楚。这样隔了一个月回来看项目自己还记得当初为什么这么定后面如果要调整也能快速定位。这个习惯帮我在很多项目里省了大麻烦。本文还有配套的精品资源点击获取