某研究院拟利用三调地类图斑数据做用地类型分析。需求简单描述为分析某一空间范围内,各类土地的面积。
其他需求:
1、 用户在Web端实现用地类型分析
2、 用户可以通过手绘确定征收、征用范围
3、 用户可以通过上传shp、kml确定征收、征用范围
4、 土地面积需按行政区划、按类进行汇总统计
5、 统计结果能够导出为excel
6、 三调数据不直接对外提供,只提供分析结果
7、 征收与征用范围重叠时,需要用户确定重叠部分分别计算征收征用面积还是重叠部分按征收计算面积。
整理上述需求,总体设计前端采用html、javascrpit等技术实现文件上传、用户绘制、统计结果导出等功能,后端实现传入用地范围,输出分类统计结果。
略。
1、 存储三调地类图斑要素类的sde文件
2、 三调地类图斑要素类名。
测试数据为一个县的数据,地类斑块约8万。
示例:
3、 征收、征用数据
数据为wkt格式,单个要素结束后,用“zs”表示征收,用“zy”表示征用。每条记录用“|”分割。
示例数据:
MULTIPOLYGON (((104.72319615800006 36.968449338000028, 104.71741406700005 36.948104946000058, 104.72976347000008 36.945249593000028, 104.73690185300006 36.958027298000047, 104.72319615800006 36.968449338000028)));'zy'|MULTIPOLYGON (((104.74989371000004 36.95381565200006, 104.73683046900004 36.944250219000025, 104.76873904100006 36.943607765000024, 104.76588368800009 36.957384844000046, 104.74989371000004 36.95381565200006)));'zs'|MULTIPOLYGON (((104.73376096500004 36.975444953000078, 104.72183986500005 36.973374822000039, 104.73849717400009 36.961597503000064, 104.74115011700007 36.971738587000061, 104.73376096500004 36.975444953000078)));'zy'
4、 市级行政区划代码与行政区划名称对应表
5、 县级行政区划代码与行政区划名称对应表
6、 乡级行政区划代码与行政区划名称对应表
7、 征收征用是否分开计算
1、 统计结果
示例:
Results:
{type: 'zs', xzqhbm: '6204031002020000000', shi: '白银市', xian: '平川区', xiang: '王家山镇', cun: '井尔川村',水浇地0102:355684.941581,旱地0103:456807.432928,其他园地0204:10991.0340928,其他林地0307:6926.02459714,其他草地0404:975104.31823,工业用地0601:2454.3626559,农村宅基地0702:32308.1631278,公路用地1003:7401.02643674,城镇村道路用地1004:1210.52360853,农村道路1006:32307.4672192,沟渠1107:18923.1634106,水工建筑用地1109:862.78139499,设施农用地1202:4702.67100571,裸土地1206:144359.484346},
{type: 'zs', xzqhbm: '6204031002030000000', shi: '白银市', xian: '平川区', xiang: '王家山镇', cun: '于大川村',旱地0103:228346.510198,其他草地0404:395005.523848,工业用地0601:610.40954762,公路用地1003:10189.0692505,农村道路1006:4957.73886657},
{type: 'zy', xzqhbm: '6204031002020000000', shi: '白银市', xian: '平川区', xiang: '王家山镇', cun: '井尔川村',水浇地0102:272707.886286,旱地0103:431029.718855,果园0201:1062.10102109,其他园地0204:7170.96103359,其他林地0307:43576.4570185,其他草地0404:2859479.81088,工业用地0601:23633.4219309,采矿用地0602:61703.4322156,农村宅基地0702:20080.6555199,特殊用地09:212.63788379,公路用地1003:8358.38708616,城镇村道路用地1004:297.62180777,农村道路1006:45673.3922054,坑塘水面1104:13784.4504369,沟渠1107:8618.88461535,设施农用地1202:1355.73091261,裸土地1206:40561.8145408}
2、 图斑的动态地图服务
采用动态服务既可以在web端看到图斑,又可防止数据泄密。地图服务采用三调地类图斑的标注符号。
采用ArcGIS GP服务的技术路线,前端直接调用GP服务的接口,实现传参与数据获取。
GP逻辑大致如下:
1、 解析前端传回的用地范围、用地类型,形成要素类。
2、 获取三调地类图斑要素类
3、 1、2中要素类做相交分析
4、 对相交分析的结果重新计算面积值
5、 按征地类型、行政区划等做统计分析
6、 构造前端需要的字符串
7、 返回前端地图服务
代码属于项目成果,不便贴出,这里给出关键及难点步骤。
可以将模板拷贝到其他IDE,编辑完成后再拷贝回来。
arcpy.CreateFeatureclass_management(gdbfile, "zsPolygon", "POLYGON",spatial_reference=sr)
解析前端传回的用地范围、用地类型,插入形成要素类。
zscursor = arcpy.da.InsertCursor(zsPolygon,[ 'SHAPE@WKT','zdlx'])
若用户选择征收征用分别计算面积,则将征收征用直接融合(arcpy.Merge_management())进一个要素类。
若用户选择重叠部分按征收计算面积,则先执行擦除空间分析(arcpy.Erase_analysis()),用征收要素类擦除征用要素类,再将两要素融合进一个要素类。
将3.5或3.6的结果与三调地类图斑做相交分析。
使用arcpy做相交分析(arcpy.Intersect_analysis())计算,保留用户输入要素类的“征地类型”字段,保留三调地类图斑中的“地类编码”、“地类名称”、“权属单位代码”、“权属单位名称”字段。此方案的优点在于脚本编写简单,逻辑清晰;缺点在于执行速度慢,一个县8万地类图斑执行相交分析需要耗时2-3分钟。
采用ST_Geometry脚本执行相交分析。ST_Intersection函数执行相交分析。先说性能,同样的一个县8万条地类图斑跑完SQL只需要十几秒。
我们在项目中使用PostgreSQL作为空间数据库。需要配置PostgreSQL客户端。配置PG客户端参考此链接https://desktop.arcgis.com/zh-cn/arcmap/latest/manage-data/gdbs-in-postgresql/setup-geodatabase-postgresql-linux.htm。
Python中需要引入psycopg2包来实现Python链接PG数据库。在桌面端调试时,需要在桌面端的Python环境中安装psycopg2包,当桌面端调试完毕,发布GP服务到服务器端时,同样需要安装psycopg2包。
需要注意的是,不管是桌面端还是服务器端,可能有多个Python环境。不能直接使用pip install psycopg2命令来安装,如果是在桌面端,则需要使用这个如下图目录中的pip.exe命令安装。
如果服务器是linux,且GP通过ArcMap发布,则不能使用pip命令安装。而是要先通过Desktop的pip命令安装2.7版本的、64位的psycopg2包,然后将安装后生成的两个文件夹复制
"INSERT INTO gswhidi_jcsj.sde.{0}(objectid,clipoid,zdlx,dlbm,dlmc,qsdwmc,qsdwdm,shape) SELECT ROW_NUMBER() OVER(),clip.objectid,clip.zdlx,landuse.dlbm,landuse.dlmc,landuse.qsdwmc,landuse.qsdwdm,sde.st_intersection (landuse.shape, clip.shape) FROM gswhidi_jcsj.sde.{1} clip,{2} landuse
WHERE sde.st_isempty(sde.st_intersection (landuse.shape, clip.shape)) = false".format(intersectClassName,"mixedPolygon"+ptime,landuseName)
其中两个核心函数是ST_Geometry中的sde.st_intersection()及sde.st_isempty()。函数的说明请见下面的链接:
https://desktop.arcgis.com/zh-cn/arcmap/latest/manage-data/using-sql-with-gdbs/st-intersection.htm
对相交分析的结果重新计算面积值(arcpy.CalculateField_management())。地类图斑数据计算面积同样是非常耗时的操作,但是工具没有采用ST_Area()的SQL语句去做面积计算,原因在于地类图斑数据是经纬度坐标,ST_Area()计算出的面积是以度为单位的面积。而数据投影后有所变形,面积计算不准确。故仍然采用arcpy的字段计算器去做面积计算。
统计分析(arcpy.Statistics_analysis())。
略。