[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

相关文章

MybatisGenerator文件生成不出对应文件的问题

《MybatisGenerator文件生成不出对应文件的问题》本文介绍了使用MybatisGenerator生成文件时遇到的问题及解决方法,主要步骤包括检查目标表是否存在、是否能连接到数据库、配置生成... 目录MyBATisGenerator 文件生成不出对应文件先在项目结构里引入“targetProje

Python使用qrcode库实现生成二维码的操作指南

《Python使用qrcode库实现生成二维码的操作指南》二维码是一种广泛使用的二维条码,因其高效的数据存储能力和易于扫描的特点,广泛应用于支付、身份验证、营销推广等领域,Pythonqrcode库是... 目录一、安装 python qrcode 库二、基本使用方法1. 生成简单二维码2. 生成带 Log

Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南

《Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南》在日常数据处理工作中,我们经常需要将不同Excel文档中的数据整合到一个新的DataFrame中,以便进行进一步... 目录一、准备工作二、读取Excel文件三、数据叠加四、处理重复数据(可选)五、保存新DataFram

SpringBoot生成和操作PDF的代码详解

《SpringBoot生成和操作PDF的代码详解》本文主要介绍了在SpringBoot项目下,通过代码和操作步骤,详细的介绍了如何操作PDF,希望可以帮助到准备通过JAVA操作PDF的你,项目框架用的... 目录本文简介PDF文件简介代码实现PDF操作基于PDF模板生成,并下载完全基于代码生成,并保存合并P

详解Java中如何使用JFreeChart生成甘特图

《详解Java中如何使用JFreeChart生成甘特图》甘特图是一种流行的项目管理工具,用于显示项目的进度和任务分配,在Java开发中,JFreeChart是一个强大的开源图表库,能够生成各种类型的图... 目录引言一、JFreeChart简介二、准备工作三、创建甘特图1. 定义数据集2. 创建甘特图3.

AI一键生成 PPT

AI一键生成 PPT 操作步骤 作为一名打工人,是不是经常需要制作各种PPT来分享我的生活和想法。但是,你们知道,有时候灵感来了,时间却不够用了!😩直到我发现了Kimi AI——一个能够自动生成PPT的神奇助手!🌟 什么是Kimi? 一款月之暗面科技有限公司开发的AI办公工具,帮助用户快速生成高质量的演示文稿。 无论你是职场人士、学生还是教师,Kimi都能够为你的办公文

2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题是由安全生产模拟考试一点通提供,流动式起重机司机证模拟考试题库是根据流动式起重机司机最新版教材,流动式起重机司机大纲整理而成(含2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题参考答案和部分工种参考解析),掌握本资料和学校方法,考试容易。流动式起重机司机考试技

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据,将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdfmake生成pdf文件 1.下载安装pdfmake第三方包 npm i pdfma

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

poj 1287 Networking(prim or kruscal最小生成树)

题意给你点与点间距离,求最小生成树。 注意点是,两点之间可能有不同的路,输入的时候选择最小的,和之前有道最短路WA的题目类似。 prim代码: #include<stdio.h>const int MaxN = 51;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int P;int prim(){bool vis[MaxN];