[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使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

C#使用Spire.XLS快速生成多表格Excel文件

《C#使用Spire.XLS快速生成多表格Excel文件》在日常开发中,我们经常需要将业务数据导出为结构清晰的Excel文件,本文将手把手教你使用Spire.XLS这个强大的.NET组件,只需几行C#... 目录一、Spire.XLS核心优势清单1.1 性能碾压:从3秒到0.5秒的质变1.2 批量操作的优雅

Python使用python-pptx自动化操作和生成PPT

《Python使用python-pptx自动化操作和生成PPT》这篇文章主要为大家详细介绍了如何使用python-pptx库实现PPT自动化,并提供实用的代码示例和应用场景,感兴趣的小伙伴可以跟随小编... 目录使用python-pptx操作PPT文档安装python-pptx基础概念创建新的PPT文档查看

在ASP.NET项目中如何使用C#生成二维码

《在ASP.NET项目中如何使用C#生成二维码》二维码(QRCode)已广泛应用于网址分享,支付链接等场景,本文将以ASP.NET为示例,演示如何实现输入文本/URL,生成二维码,在线显示与下载的完整... 目录创建前端页面(Index.cshtml)后端二维码生成逻辑(Index.cshtml.cs)总结

Python实现数据可视化图表生成(适合新手入门)

《Python实现数据可视化图表生成(适合新手入门)》在数据科学和数据分析的新时代,高效、直观的数据可视化工具显得尤为重要,下面:本文主要介绍Python实现数据可视化图表生成的相关资料,文中通过... 目录前言为什么需要数据可视化准备工作基本图表绘制折线图柱状图散点图使用Seaborn创建高级图表箱线图热

SQLServer中生成雪花ID(Snowflake ID)的实现方法

《SQLServer中生成雪花ID(SnowflakeID)的实现方法》:本文主要介绍在SQLServer中生成雪花ID(SnowflakeID)的实现方法,文中通过示例代码介绍的非常详细,... 目录前言认识雪花ID雪花ID的核心特点雪花ID的结构(64位)雪花ID的优势雪花ID的局限性雪花ID的应用场景

Django HTTPResponse响应体中返回openpyxl生成的文件过程

《DjangoHTTPResponse响应体中返回openpyxl生成的文件过程》Django返回文件流时需通过Content-Disposition头指定编码后的文件名,使用openpyxl的sa... 目录Django返回文件流时使用指定文件名Django HTTPResponse响应体中返回openp

python生成随机唯一id的几种实现方法

《python生成随机唯一id的几种实现方法》在Python中生成随机唯一ID有多种方法,根据不同的需求场景可以选择最适合的方案,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习... 目录方法 1:使用 UUID 模块(推荐)方法 2:使用 Secrets 模块(安全敏感场景)方法

Python实现自动化Word文档样式复制与内容生成

《Python实现自动化Word文档样式复制与内容生成》在办公自动化领域,高效处理Word文档的样式和内容复制是一个常见需求,本文将展示如何利用Python的python-docx库实现... 目录一、为什么需要自动化 Word 文档处理二、核心功能实现:样式与表格的深度复制1. 表格复制(含样式与内容)2