Python 读取.shp文件并生成图幅编号的实现思路

 更新时间:2024年05月29日 09:57:12   作者:ThsPool  
这篇文章主要介绍了Python 读取.shp文件并生成图幅编号,代码适用于需要处理和分析地理空间数据的场景,如城市规划、环境监测或自然资源管理,其中它可以帮助用户读取特定区域的Shapefile文件,确定其地理边界,需要的朋友可以参考下

代码适用于需要处理和分析地理空间数据的场景,如城市规划、环境监测或自然资源管理,其中它可以帮助用户读取特定区域的Shapefile文件,确定其地理边界,并基于这些边界计算出按照经纬度5度间隔的图幅编号,进而用于地图制作、空间数据管理和快速数据检索。

实现思路:

代码主要用于处理地理空间数据,具体功能如下:

  • 读取一个Shapefile(.shp)文件,获取其地理边界范围。
  • 根据获取的边界范围,计算出按照经纬度 间隔的图幅编号。
  • 将每个国家的地图边界范围和对应的图幅编号存储起来,并打印出来。

完整代码

import csv
import geopandas as gpd
def get_map_extent(shp_file_path):
    """
    读取.shp文件并获取其边界范围。
    :param shp_file_path: .shp文件路径
    :return: 地图边界的范围 (minx, miny, maxx, maxy)
    """
    # 读取.shp文件
    gdf = gpd.read_file(shp_file_path)
    # 获取地图边界
    boundary = gdf.geometry.total_bounds
    # 返回地图范围
    return boundary
def calculate_sheet_ranges(map_extent):
    """
    根据地图边界计算图幅范围,并按照南北纬和东西经的5度分隔规则返回图幅范围的格式。
    :param map_extent: 地图边界的范围 (minx, miny, maxx, maxy)
    :return: 图幅范围列表,每个元素包含(lon_start, lat_start, lon_end, lat_end, sheet_range)
    """
    minx, miny, maxx, maxy = map_extent
    # 初始化图幅范围列表
    sheet_ranges = []
    # 计算图幅编号
    # for lon_start in range(int(minx // 5) * 5, int(maxx // 5 + 1) * 5, 5):
    #     for lat_start in range(int(miny // 5) * 5, int(maxy // 5 + 1) * 5, 5):
    for lon_start in range(int(minx // 5) * 5, int(maxx // 5 + 1) * 5, 5):
        for lat_start in range(int(miny // 5 + 1) * 5, int(maxy // 5 + 2) * 5, 5):  # GLC_FCS30D 纬度需要上调一格5度
            lon_end = lon_start + 5
            lat_end = lat_start + 5
            sheet_range = f"{'W' if lon_start < 0 else 'E'}{abs(lon_start)}" \
                          f"{'S' if lat_start < 0 else 'N'}{abs(lat_start)}"
            sheet_ranges.append(sheet_range)
    return sheet_ranges
def main():
    iso_data = []
    with open('../../ISO.csv', newline='') as csvfile:
        # 创建 CSV 读取器
        csv_reader = csv.reader(csvfile)
        data = list(csv_reader)  # 将文件内容读取到内存中
        # 初始化行数计数器
        iso_count = 0
        for country in data:
            iso_count += 1
            sids_country = country[0]
            iso_map_extent = [iso_count, sids_country]  # [1, 'BMU']
            # 示例文件路径
            shp_file_path = fr'path_to_admin_division\{sids_country}.shp'
            # 获取地图范围
            map_extent = get_map_extent(shp_file_path=shp_file_path)
            # 计算图幅范围
            sheet_ranges = calculate_sheet_ranges(map_extent=map_extent)
            # 打印结果
            print(iso_count, sids_country, map_extent)
            iso_map_extent.extend(sheet_ranges)
            iso_data.append(iso_map_extent)
            print('- Map Extent Num: ', len(sheet_ranges), iso_map_extent[2:], '\n')
if __name__ == '__main__':
    main()

实现流程:

  • 导入库:导入csv库用于读取CSV文件,导入geopandas库用于处理地理空间数据。
  • 定义get_map_extent函数:该函数接收一个.shp文件路径作为参数,读取该文件,并返回其地理边界范围。
  • 定义calculate_sheet_ranges函数:该函数接收一个边界范围作为参数,计算并返回一个图幅编号列表。图幅编号的计算规则是按照经纬度5度的间隔。
  • 定义main函数:这是程序的主要执行函数。它首先读取一个CSV文件,然后对于CSV文件中的每一个条目,执行以下步骤:
    • 构造.shp文件路径。
    • 调用get_map_extent函数获取地图边界范围。
    • 调用calculate_sheet_ranges函数计算图幅编号。
    • 打印出当前处理的国家和其地图边界范围。
    • 将地图边界范围和图幅编号添加到结果列表中。

执行入口:如果该脚本作为主程序运行,将调用main函数。

代码运行示例: 预备Shapefile文件:

程序输出:

应用范围:

  • 地理信息系统(GIS):用于处理和分析地理空间数据。
  • 地图制作:确定地图的边界范围和图幅编号,有助于地图的制作和布局。
  • 空间数据分析:在进行空间数据分析时,可以利用此脚本快速获取地图边界和图幅编号,进而进行更深入的分析。
  • 科研和教育:在地理学、城市规划、环境科学等领域的研究和教学中,用于数据处理和分析。

注意事项:

  • 代码中的shp_file_path是一个格式化字符串,需要根据实际的文件路径进行调整。
  • calculate_sheet_ranges函数中的注释掉的代码块可能是用于不同的计算规则或示例。
  • 代码中的打印语句用于调试和验证,展示了每个国家的边界范围和图幅编号。

相关函数及调用库的解释说明:

函数及调用库描述
csvPython标准库中的模块,用于读写CSV(逗号分隔值)文件。在此代码中,它被用来读取包含国家信息的CSV文件。
geopandas一个开源项目,扩展了pandas库的功能,使其能够处理地理空间数据。它允许用户读取、处理和分析地理空间数据。
get_map_extent(shp_file_path)此函数接收一个Shapefile的文件路径作为参数,使用geopandas的read_file方法读取Shapefile,并获取其几何边界。返回值是一个包含最小经度、最小纬度、最大经度、最大纬度的元组。
calculate_sheet_ranges(map_extent)此函数接收一个地图边界范围作为参数,并基于这个范围计算图幅编号。按照南北纬和东西经的5度间隔规则来划分图幅,并返回一个包含这些图幅编号的列表。

到此这篇关于Python 读取.shp文件并生成图幅编号的文章就介绍到这了,更多相关Python 读取.shp文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于Python实现自制拼图小游戏

    基于Python实现自制拼图小游戏

    这篇文章主要为大家详细介绍得了如何利用Python中pygame的这个非标准库来做个小游戏-拼图,文中的示例代码讲解详细,感兴趣的小伙伴可以尝试一下
    2022-11-11
  • Python实现的远程文件自动打包并下载功能示例

    Python实现的远程文件自动打包并下载功能示例

    这篇文章主要介绍了Python实现的远程文件自动打包并下载功能,结合实例形式分析了Python使用spawn()方法执行ssh、scp 命令实现远程文件的相关操作技巧,需要的朋友可以参考下
    2019-07-07
  • django基础学习之send_mail功能

    django基础学习之send_mail功能

    这篇文章主要给大家介绍了关于django基础学习之send_mail功能的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用django具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • Android基于TCP和URL协议的网络编程示例【附demo源码下载】

    Android基于TCP和URL协议的网络编程示例【附demo源码下载】

    这篇文章主要介绍了Android基于TCP和URL协议的网络编程,结合实例形式分析了Android网络编程的通信原理、实现步骤与相关操作技巧,并附带demo源码供读者下载参考,需要的朋友可以参考下
    2018-01-01
  • Python中的wordcloud库安装问题及解决方法

    Python中的wordcloud库安装问题及解决方法

    这篇文章主要介绍了Python中的wordcloud库安装问题及解决方法,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • Python heapq库案例详解

    Python heapq库案例详解

    这篇文章主要介绍了Python heapq库案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • python 内置库wsgiref的使用(WSGI基础入门)

    python 内置库wsgiref的使用(WSGI基础入门)

    WSGI(web服务器网关接口)主要规定了服务器端和应用程序之间的接口,即规定了请求的URL到后台处理函数之间的映射该如何实现。wsgiref是一个帮助开发者开发测试的Python内置库,程序员可以通过这个库了解WSGI的基本运行原理,但是不能把它用在生产环境上。
    2021-06-06
  • 基于python中pygame模块的Linux下安装过程(详解)

    基于python中pygame模块的Linux下安装过程(详解)

    下面小编就为大家带来一篇基于python中pygame模块的Linux下安装过程(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • Python应用开发频繁假死的问题分析及解决

    Python应用开发频繁假死的问题分析及解决

    最近在开发一款自动化的应用,但是,在测试时,却发现了问题,当我点击暂停任务后,此时子线程被阻塞,如果我这个时候点击停止,那么就会任务结束,之后,如果我再点击开始运行,整个应用就会卡死,所以本文介绍了Python应用开发频繁假死的问题分析及解决,需要的朋友可以参考下
    2024-08-08
  • python构造icmp echo请求和实现网络探测器功能代码分享

    python构造icmp echo请求和实现网络探测器功能代码分享

    本文分享了二个python示例,python构造icmp echo请求、实现网络探测器功能代码,类似nmap功能
    2014-01-01

最新评论