[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编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

java中使用POI生成Excel并导出过程

《java中使用POI生成Excel并导出过程》:本文主要介绍java中使用POI生成Excel并导出过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求说明及实现方式需求完成通用代码版本1版本2结果展示type参数为atype参数为b总结注:本文章中代码均为

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

C/C++随机数生成的五种方法

《C/C++随机数生成的五种方法》C++作为一种古老的编程语言,其随机数生成的方法已经经历了多次的变革,早期的C++版本使用的是rand()函数和RAND_MAX常量,这种方法虽然简单,但并不总是提供... 目录C/C++ 随机数生成方法1. 使用 rand() 和 srand()2. 使用 <random

Flask 验证码自动生成的实现示例

《Flask验证码自动生成的实现示例》本文主要介绍了Flask验证码自动生成的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习... 目录生成图片以及结果处理验证码蓝图html页面展示想必验证码大家都有所了解,但是可以自己定义图片验证码

Python如何在Word中生成多种不同类型的图表

《Python如何在Word中生成多种不同类型的图表》Word文档中插入图表不仅能直观呈现数据,还能提升文档的可读性和专业性,本文将介绍如何使用Python在Word文档中创建和自定义各种图表,需要的... 目录在Word中创建柱形图在Word中创建条形图在Word中创建折线图在Word中创建饼图在Word

nginx生成自签名SSL证书配置HTTPS的实现

《nginx生成自签名SSL证书配置HTTPS的实现》本文主要介绍在Nginx中生成自签名SSL证书并配置HTTPS,包括安装Nginx、创建证书、配置证书以及测试访问,具有一定的参考价值,感兴趣的可... 目录一、安装nginx二、创建证书三、配置证书并验证四、测试一、安装nginxnginx必须有"-

Java实战之利用POI生成Excel图表

《Java实战之利用POI生成Excel图表》ApachePOI是Java生态中处理Office文档的核心工具,这篇文章主要为大家详细介绍了如何在Excel中创建折线图,柱状图,饼图等常见图表,需要的... 目录一、环境配置与依赖管理二、数据源准备与工作表构建三、图表生成核心步骤1. 折线图(Line Ch

浅析如何使用Swagger生成带权限控制的API文档

《浅析如何使用Swagger生成带权限控制的API文档》当涉及到权限控制时,如何生成既安全又详细的API文档就成了一个关键问题,所以这篇文章小编就来和大家好好聊聊如何用Swagger来生成带有... 目录准备工作配置 Swagger权限控制给 API 加上权限注解查看文档注意事项在咱们的开发工作里,API