[ArcPy] 将道路(shp)平均分配给志愿者 生成6*6格网 | 第六届全国大学生GIS技能大赛试题

本文主要是介绍[ArcPy] 将道路(shp)平均分配给志愿者 生成6*6格网 | 第六届全国大学生GIS技能大赛试题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第六届全国大学生GIS应用技能大赛 下午题目
完整试题:http://www.higis.cn/753

文章目录

  • 前言
    • 题目
    • 数据说明
    • 分析
    • 结果
  • ArcPy实现
    • 代码
    • 制作ArcGIS自定义工具
    • 生成的6*6格网
    • 连接志愿者表

所有文件下载: http://download.csdn.net/download/summer_dew/10164828

前言

题目

创建一个6*6的格网,将商业圈道路数据随机分配到不同的志愿者进行管理

【方法一】用ArcGIS创建渔网-> 将志愿者的编号、道路ID进行连接
【缺点】没有体现随机分配

【方法二】用Arcpy创建每个志愿者的工作范围,并随机生成每个面的ID,达到随机分配的要求

数据说明

road.shp 商业圈道路数据
这里写图片描述

volunteer.xls 志愿者统计表
这里写图片描述

分析

问题实际上,就是把道路数据平均分成36块,然后每一块分配一个志愿者

  1. 怎么把道路数据平均分36块:得到道路数据的范围,按范围平均分
  2. 怎么把志愿者分配到每块中:生成一个6*6的随机矩阵,值在0-35之内,并值不能重复。然后将volunteer表格按id连接到里面

结果

这里写图片描述

ArcPy实现

代码

	# -*- coding:utf-8 -*-# Author: PasserQi# Time:2017/12/18# Func:将shp文件分成6*6份,每份赋予分配0-35中不同的值,输出形式为面状shp# Desc:若要创建ArcGIS自定义工具,该文件不能出现中文import sys,arcpyimport arcgisscripting,osimport random# 制作ArcGIS自定义工具箱时,得到初始参数# filein = sys.argv[1]# fileout = sys.argv[2]# rowNum = int(sys.argv[3])# 测试数据filein = r'E:\user\Desktop\RandShp\Data\road.shp'fileout = r'E:\user\Desktop\RandShp\rand_polygon.shp'number = 6# @function:产生number*number个不重复的随机数,数值范围在0 <= n <= number-1# @param: number# @return: listdef getRandList(number):randList = []while len(randList) != number*number:n = random.randint(0, number*number-1) #产生随机数:0 <= n <= number-1if n in randList: #已经生成过了continueelse:randList.append(n)return randListif __name__ == '__main__':desc = arcpy.Describe(filein) #获取shp的信息# shp的范围XMin = desc.extent.XMinXMax = desc.extent.XMaxYMin = desc.extent.YMinYMax = desc.extent.YMaxstep_x = (XMax - XMin) / number # x的步长step_y = (YMax - YMin) / number # y的步长#得到number*number个不重复的随机数randList =  getRandList(number)# ------------------------------------# 保存成shp文件gp = arcgisscripting.create()# 创建shp文件outWorkspace = os.path.split(fileout)[0]outName = os.path.split(fileout)[-1]spat_ref = desc.spatialReferencegp.CreateFeatureClass_management(outWorkspace, outName, "POLYGON", "", "", "", spat_ref)# 添加字段gp.AddField_management(fileout, "number", "LONG")# 获取fileout文件的游标,插入数据cur = gp.InsertCursor(fileout)# 新的一行newRow = cur.newRow()# 插入数据for i in range(0,number):for j in range(0,number):XYarray = gp.CreateObject("array")point = gp.CreateObject("point")# 左下角点point.X = XMin + i*step_xpoint.Y = YMin + j*step_yXYarray.add(point)# 左上角point.X = XMin + (i + 1) * step_xpoint.Y = YMin + j * step_yXYarray.add(point)# 右上角point.X = XMin + (i + 1) * step_xpoint.Y = YMin + (j + 1) * step_yXYarray.add(point)# 右下角point.X = XMin + i * step_xpoint.Y = YMin + (j+1) * step_yXYarray.add(point)# 左下角点point.X = XMin + i * step_xpoint.Y = YMin + j * step_yXYarray.add(point)newRow.setValue("Shape",XYarray) #实体的形状,面状一定要闭合的点newRow.setValue("number",randList[i*6+j] ) #插入随机分配的值cur.InsertRow(newRow) #新的一行del cur,newRow

制作ArcGIS自定义工具

注意:若要将py文件制作成ArcGIS自定义工具,py文件中不能出现中文字符,否则会有异常错误。这里先将中文字符全部删除,再创建

为road.shp生成6*6的格网
自定义工具

生成的6*6格网

按road.shp范围生成了一个6*6的格网rand_polygon.shp,每个格网都有一个number属性,标识该格分配的志愿者id

这里写图片描述

连接志愿者表

将voluteer.xls中的id与rand_polygon.shp的number字段连接,可以得到分配的志愿者名字

这里写图片描述

这篇关于[ArcPy] 将道路(shp)平均分配给志愿者 生成6*6格网 | 第六届全国大学生GIS技能大赛试题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/705545

相关文章

Java使用Spire.Barcode for Java实现条形码生成与识别

《Java使用Spire.BarcodeforJava实现条形码生成与识别》在现代商业和技术领域,条形码无处不在,本教程将引导您深入了解如何在您的Java项目中利用Spire.Barcodefor... 目录1. Spire.Barcode for Java 简介与环境配置2. 使用 Spire.Barco

SpringBoot集成iText快速生成PDF教程

《SpringBoot集成iText快速生成PDF教程》本文介绍了如何在SpringBoot项目中集成iText9.4.0生成PDF文档,包括新特性的介绍、环境准备、Service层实现、Contro... 目录SpringBoot集成iText 9.4.0生成PDF一、iText 9新特性与架构变革二、环

idea-java序列化serialversionUID自动生成方式

《idea-java序列化serialversionUID自动生成方式》Java的Serializable接口用于实现对象的序列化和反序列化,通过将对象转换为字节流来存储或传输,实现Serializa... 目录简介实现序列化serialVersionUID配置使用总结简介Java.io.Seripyth

Java中的随机数生成案例从范围字符串到动态区间应用

《Java中的随机数生成案例从范围字符串到动态区间应用》本文介绍了在Java中生成随机数的多种方法,并通过两个案例解析如何根据业务需求生成特定范围的随机数,本文通过两个实际案例详细介绍如何在java中... 目录Java中的随机数生成:从范围字符串到动态区间应用引言目录1. Java中的随机数生成基础基本随

C#自动化生成PowerPoint(PPT)演示文稿

《C#自动化生成PowerPoint(PPT)演示文稿》在当今快节奏的商业环境中,演示文稿是信息传递和沟通的关键工具,下面我们就深入探讨如何利用C#和Spire.Presentationfor.NET... 目录环境准备与Spire.Presentation安装核心操作:添加与编辑幻灯片元素添加幻灯片文本操

Python实现Word文档自动化的操作大全(批量生成、模板填充与内容修改)

《Python实现Word文档自动化的操作大全(批量生成、模板填充与内容修改)》在职场中,Word文档是公认的好伙伴,但你有没有被它折磨过?批量生成合同、制作报告以及发放证书/通知等等,这些重复、低效... 目录重复性文档制作,手动填充模板,效率低下还易错1.python-docx入门:Word文档的“瑞士

使用python生成固定格式序号的方法详解

《使用python生成固定格式序号的方法详解》这篇文章主要为大家详细介绍了如何使用python生成固定格式序号,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录生成结果验证完整生成代码扩展说明1. 保存到文本文件2. 转换为jsON格式3. 处理特殊序号格式(如带圈数字)4

Java使用Swing生成一个最大公约数计算器

《Java使用Swing生成一个最大公约数计算器》这篇文章主要为大家详细介绍了Java使用Swing生成一个最大公约数计算器的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下... 目录第一步:利用欧几里得算法计算最大公约数欧几里得算法的证明情形 1:b=0情形 2:b>0完成相关代码第二步:加

k8s admin用户生成token方式

《k8sadmin用户生成token方式》用户使用Kubernetes1.28创建admin命名空间并部署,通过ClusterRoleBinding为jenkins用户授权集群级权限,生成并获取其t... 目录k8s admin用户生成token创建一个admin的命名空间查看k8s namespace 的

C#实现SHP文件读取与地图显示的完整教程

《C#实现SHP文件读取与地图显示的完整教程》在地理信息系统(GIS)开发中,SHP文件是一种常见的矢量数据格式,本文将详细介绍如何使用C#读取SHP文件并实现地图显示功能,包括坐标转换、图形渲染、平... 目录概述功能特点核心代码解析1. 文件读取与初始化2. 坐标转换3. 图形绘制4. 地图交互功能缩放