使用Arcgis做路径规划方式(使用python脚本调用)

 更新时间:2024年12月20日 08:50:59   作者:子裳  
本文介绍了如何使用ArcGIS和Python来解决铁路路径规划问题,通过配置ArcGIS、导入路网数据和列车行驶点数据、处理线要素、构建拓扑结构,可以使用Network Analyst工具进行路径分析,最后,通过Python脚本自动化处理大量数据,生成最优路径

场景

如何在全部的铁路线路数据中找到点到点的路径,并且点与点之前的路线可能跨越其它点-也就是路径规划的问题。

须知

  • argis: “计算机制图”应用,包含了全球范围内的底图、地图数据、应用程序,以及可配置的应用模板和开发人员使用的 GIS 工具和 API,可用于创建 Web 地图、发布GIS服务、共享地图、数据和应用程序
  • 路径规划:根据起始出发点和到达点(可设置途经点和障碍点),在已确定的路网数据中找到最优路线(最短路程,最低时间)

工具

  • argis10.2 
  • python2(建议使用arcgis自带python)

数据

以铁路数据为例: 

  • 路网数据(全国铁路线路shp文件) 
  • 列车行驶中所有的点到点的列表数据(shp文件形式,可用cvs转成shp)

步骤

argis配置

配置好argis,在argis客户端计算出一次路径分析,保证argis可执行

配置允许进行网络数据集操作

点击菜单customize->extensions,勾选network analyst

点击菜单customize->toolbar,勾选network analyst

数据导入

1.打开ArcCatalog,找到文件树后右键新建“File Geodatabase”,随后在新建的gdb上右键新建“feature dataset ”,之后在dataset上右键,选择“Import”–>“Feature Class”导入你的路网数据

创建dataset时需要选择对应的投影和地理坐标系

结果如下:

2.线处理:进行线要素的处理 

  • 相交线打断。在arcToolBox的data management tools —>features—>featuretoline。
  • 在点要素处打断线。在arcToolBox的data management tools —>features—>split line at point。

3.构建拓扑结构:在数据集dataset上右键,New —> Network Dataset…

结果如下:

4.新建一次分析:network analyst —> New Route

结果如下,左侧为本次分析的数据集界面:

5.增加途经点:Stops 右键 -> Load Locations…

选择途经点图层导入途经点 

结果如下:

6.分析路径:

点击 solve

结果如下:

左侧下的Routes就是我们需要的数据

python执行准备

脚本:以下代码

前面配置的网络数据集

火车站数据以出发点,结束点两个点为一组,全部路线数据(shp),如下图所示,相同的sort为一组:

执行脚本

PS: 数据量多时,可同时执行多个脚本,但是执行的参数需要错开,并且网络数据集需要每个脚本一个,避免出现操作文件是出现冲突,导致异常。

#调用argis接口 根据点查找路径,并将路径保存到shp文件中
import arcpy
from arcpy import env

try:
    #Check out the Network Analyst extension license
    arcpy.CheckOutExtension("Network")

    #Set environment settings  配置argis的当前基础数据的数据文件地址
    env.workspace = "C:/Documents/ArcGIS/routeana0.gdb"
        env.overwriteOutput = True
    
    #Set local variables  配置好的网络数据集(NetworkDataset)位置  即基础数据
    inNetworkDataset = "train/train_ND"
    #输出的经过点的图层名称
    outNALayerName = "StationRoute"
    impedanceAttribute = "Length"
    inAddressLocator = "train_station_copy"
    #所有经过点的图层位置
    allinFeatures = "s2sdis"
    #输入经过点数据表位置
    inAddressTable = "G:/ArcGIS/python/StopAddresses.csv"
    #输入经过点数据表 字段
    inAddressFields = "Name Name VISIBLE NONE"
    #输出经过点图层名称
    outStops = "GeocodedStops"
    #输出经过点图层保存地址
    outLayerFile = "G:/ArcGIS/python" + "/" + outNALayerName + ".lyr"
    searchTolerance = "3000 Meters"
    
    #Create a new Route layer. For this scenario, the default value for all the
    #remaining parameters statisfies the analysis requirements
    outNALayer = arcpy.na.MakeRouteLayer(inNetworkDataset, outNALayerName,
                                         impedanceAttribute)
    
    #Get the layer object from the result object. The route layer can now be
    #referenced using the layer object.  得到输出图层集
    outNALayer = outNALayer.getOutput(0)
    
    #Get the names of all the sublayers within the route layer.
    #得到输出图层名称
    subLayerNames = arcpy.na.GetNAClassNames(outNALayer)
    #Stores the layer names that we will use later  根据名称获取对应图层
    stopsLayerName = subLayerNames["Stops"]
    routesLayerName = subLayerNames["Routes"]
    
    #需要分析多次 筛选多批次的经过点  数据量大时可分批执行
    for i in range(int(start),int(end)) :
        筛选当前批次的经过点到临时图层station2station0
        inFeatures = arcpy.Select_analysis(allinFeatures, "station2station0", '"sort" = '+str(i))
        
        #Load the geocoded address locations as stops mapping the address field from
        #geocoded stop features as Name property using field mappings.
        #网络数据集中清除原来的点,并加入输出经过点图层中的点
        arcpy.na.AddLocations(outNALayer, stopsLayerName, inFeatures, "Name Name #",
                                  searchTolerance, append = "CLEAR",exclude_restricted_elements = "EXCLUDE")
    
        #Solve the route layer, ignore any invalid locations such as those that
        #can not be geocoded
        #执行查找路径方法  可能存在找不到路径的情况 捕捉异常,不打断循环
        try:
            result = arcpy.na.Solve(outNALayer,"SKIP")
        except Exception as e:
            # If an error occurred, print line number and error message
            import traceback, sys
            tb = sys.exc_info()[2]
            print "An error occured on line %i" % tb.tb_lineno
            # 删除临时图层,避免下次创建图层时出错
            arcpy.Delete_management("station2station0")
            print str(e)
            print str(i)
            continue
    
        # 删除临时图层,避免下次创建图层时出错
        arcpy.Delete_management("station2station0")
        #Get the polygons sublayer from the service area layer
        #获取结果中路径的图层
        routes_sublayer = arcpy.mapping.ListLayers(outNALayer,
                                            routesLayerName)[0]
        #将获得的路径汇总到时s2s的shp中
        arcpy.Append_management([routes_sublayer], "s2s", "TEST")

    print("Script completed successfully")

except Exception as e:
    # If an error occurred, print line number and error message
    import traceback, sys
    tb = sys.exc_info()[2]
    print ("An error occured on line %i" % tb.tb_lineno)
    print (str(e))

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • pandas求行最大值及其索引的实现

    pandas求行最大值及其索引的实现

    工作需要,查询某一行中的最大值及其索引,本文主要介绍了pandas求行最大值及其索引的实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-04-04
  • Django框架 信号调度原理解析

    Django框架 信号调度原理解析

    这篇文章主要介绍了Django框架 信号调度原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • Python dict和defaultdict使用实例解析

    Python dict和defaultdict使用实例解析

    这篇文章主要介绍了Python dict和defaultdict使用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Django 中使用日志的方法

    Django 中使用日志的方法

    Django 使用 Python 内置的 logging 模块处理系统日志,所以,只要掌握了 Python 中的 logging 模块,基本也就能够在 django 中使用日志了,本文重点给大家介绍django 中使用日志的方法,感兴趣的朋友一起看看吧
    2022-07-07
  • 教你使用conda虚拟环境管理(创建、激活、重命名、删除虚拟环境)

    教你使用conda虚拟环境管理(创建、激活、重命名、删除虚拟环境)

    conda是一个强大的Python包管理和环境管理工具,它可以帮助我们轻松地安装、更新、卸载和切换不同版本的Python和各种第三方库,本文就来介绍一下conda虚拟环境管理(创建、激活、重命名、删除虚拟环境),感兴趣的可以了解一下
    2024-01-01
  • Django自定义模板过滤器和标签的实现方法

    Django自定义模板过滤器和标签的实现方法

    这篇文章主要介绍了Django自定义模板过滤器和标签的实现方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • python DataFrame数据格式化(设置小数位数,百分比,千分位分隔符)

    python DataFrame数据格式化(设置小数位数,百分比,千分位分隔符)

    本文主要介绍了python DataFrame数据格式化,例如设置小数位数,百分比,千分位分隔符,具有一定的参考价值,感兴趣的可以了解一下
    2022-03-03
  • 用十张图详解TensorFlow数据读取机制(附代码)

    用十张图详解TensorFlow数据读取机制(附代码)

    这篇文章主要介绍了用十张图详解TensorFlow数据读取机制(附代码),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • vscode和Anaconda安装以及相关环境配置指南

    vscode和Anaconda安装以及相关环境配置指南

    Anaconda是一个开源的python发行版本,是现在比较流行的python数据科学平台,可以对python的科学包做到有效管理,这篇文章主要给大家介绍了关于vscode和Anaconda安装以及相关环境配置指南的相关资料,需要的朋友可以参考下
    2023-11-11
  • python通过第三方库操作PDF文件的几种常见方法

    python通过第三方库操作PDF文件的几种常见方法

    Python是一种高级编程语言,主要用于数据分析、机器学习、图像处理等领域,在PDF文件处理方面,Python有许多强大的库和工具,这篇文章主要给大家介绍了关于python通过第三方库操作PDF文件的几种常见方法,需要的朋友可以参考下
    2024-02-02

最新评论