利用python生成经纬网格shp

最开始,我使用的是QGIS工具箱里的创建网格工具去生成经纬网格数据,但是由于18级的经纬网格数据量过大,内存不够用,电脑直接崩掉,且生成的格网数据为一个个的矩形,数据类型为polygon,不方便后续操作,从而改用python脚本处理数据,代码如下:

import geopandas as gpd
from shapely.geometry import Polygon, LineString
def create_grid_lines(x_min, x_max, y_min, y_max, cell_size):
    # 确保 cell_size 大于 0
    if cell_size <= 0:
        raise ValueError("Cell_size必须大于0")
    
    # 生成经纬度网格
    lines = []
    
    # 计算步长
    step = int(cell_size * 100000)
    
    # 检查计算的步长
    if step <= 0:
        raise ValueError("计算的步长必须大于0,检查cell_size.")
    
    print(f"步长: {step}")  # 打印步长,便于调试
    
    # 计算总的步骤数量以便于显示进度
    num_x_steps = (int(x_max * 100000) - int(x_min * 100000)) // step
    num_y_steps = (int(y_max * 100000) - int(y_min * 100000)) // step
    total_steps = num_x_steps * num_y_steps
    current_step = 0
    
    for x in range(int(x_min * 100000), int(x_max * 100000), step):
        for y in range(int(y_min * 100000), int(y_max * 100000), step):
            # 创建矩形的四条边对应的线段
            lines.append(LineString([
                (x / 100000.0, y / 100000.0),
                (x / 100000.0, (y + step) / 100000.0),  # 左边
            ]))
            lines.append(LineString([
                (x / 100000.0, (y + step) / 100000.0),
                ((x + step) / 100000.0, (y + step) / 100000.0),  # 上边
            ]))
            lines.append(LineString([
                ((x + step) / 100000.0, (y + step) / 100000.0),
                ((x + step) / 100000.0, y / 100000.0),  # 右边
            ]))
            lines.append(LineString([
                ((x + step) / 100000.0, y / 100000.0),
                (x / 100000.0, y / 100000.0),  # 下边
            ]))
            
            current_step += 1
            
            # 打印当前进度
            if current_step % (total_steps // 100) == 0:  # 每0.001%的进度
                print(f"进度: {current_step / total_steps * 100:.2f}%")
    
    return gpd.GeoDataFrame(lines, columns=['geometry'])
# 设置台湾区域和网格大小
x_min, x_max = 119.62, 122.25  # 经度范围
y_min, y_max = 21.84, 25.35     # 纬度范围
cell_size = 0.001
# 确保 cell_size 是一个正确的值,类型也正确
print(f"Cell size: {cell_size}")  # 打印 cell_size,便于调试
# 创建线网格
grid_lines = create_grid_lines(x_min, x_max, y_min, y_max, cell_size)
# 导出为 shapefile
grid_lines.to_file("grid_taiwan_lines.shp")
print("生成grid_taiwan_lines.shp")

执行该脚本需要import geopandas as gpd from shapely.geometry import Polygon, LineString

如果本地环境不方便安装可在虚拟环境下执行

<think>好的,我需要回答用户关于如何用Python绘制地图的问题,特别是使用matplotlib、geopandas等库的教程。首先,我要回忆一下相关的库和方法。 用户提到了matplotlib、cartopy和geopandas,这些都是Python中常用的地理数据可视化工具。根据提供的引用内容,我需要整合这些信息,给出一个清晰的步骤指南。 首先,可能需要介绍每个库的基本用途。例如,geopandas是基于pandas的,专门处理地理空间数据,可以方便地读取shapefile等格式的地图数据。然后,matplotlib是基础的绘图库,cartopy则用于地理投影和更复杂的地图元素添加。 接下来,应该分步骤说明如何使用这些库。比如,首先安装必要的库,然后加载地理数据,使用geopandas进行基本绘图,叠加不同的图层,调整样式,以及添加坐标轴和标签等。同时,结合引用中的例子,比如如何用geopandas的plot函数,设置kind参数绘制散点图,或者叠加几何中心点。 需要注意用户提到的引用内容,比如引用[3]中提到的叠加几何中心绘图的例子,可以作为一个步骤来讲解。此外,引用[2]提到kind参数的使用,可以说明除了地图外的其他图形类型。 还要确保回答符合系统级指令,比如正确使用$$格式的独立公式,但这个问题可能涉及较少数学公式,更多的是代码示例。不过如果有涉及坐标转换或投影的数学内容,可能需要用LaTeX表达。 另外,需要生成相关问题,可能包括性能优化、更高级的功能,或者与其他库的比较等。比如,如何添加地图背景,如何处理大规模地理数据,或者如何结合cartopy进行更复杂的地图投影。 最后,检查回答结构是否清晰,步骤是否合理,并正确引用提供的参考资料。确保代码示例正确,并指导用户如何安装库和获取数据,比如推荐下载自然地球的数据集。</think>以下是如何使用Python绘制地图的分步指南,结合了`geopandas`、`matplotlib`和`cartopy`库的核心功能: --- ### 1. **安装依赖库** ```bash pip install geopandas matplotlib cartopy ``` - **geopandas**:基于`pandas`的地理空间数据处理库,支持`shp`文件读取和基本绘图[^3]。 - **cartopy**:提供地理投影、坐标系统转换和地图元素(如国界线、河流)的绘制功能[^1]。 - **matplotlib**:基础绘图库,与上述工具无缝集成。 --- ### 2. **加载地理数据** 使用`geopandas`读取Shapefile格式的地图数据(如国家边界): ```python import geopandas as gpd # 示例:加载自然地球数据集中的国家边界数据 world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres')) ``` --- ### 3. **基础地图绘制** 直接调用`plot()`函数生成地图: ```python import matplotlib.pyplot as plt # 绘制国家边界 world.plot(edgecolor='black', facecolor='lightblue') plt.title("全球国家分布") plt.show() ``` --- ### 4. **叠加几何要素** 叠加几何中心点或自定义标记: ```python # 计算几何中心并叠加 world["centroid"] = world.geometry.centroid ax = world.plot(figsize=(10,6)) world["centroid"].plot(ax=ax, color='red', markersize=5) plt.show() ``` ![示例:叠加几何中心的地图](https://via.placeholder.com/400x200.png?text=地图示例) --- ### 5. **调整样式与颜色** 根据数据字段(如人口)进行颜色映射: ```python # 按人口数量着色 world.plot(column='pop_est', legend=True, legend_kwds={'label': "人口数量"}, cmap='OrRd', figsize=(12,8)) plt.title("全球人口分布") plt.show() ``` --- ### 6. **添加地理投影与地图元素** 通过`cartopy`定义投影并添加经纬网格: ```python import cartopy.crs as ccrs fig = plt.figure(figsize=(12,8)) ax = fig.add_subplot(1,1,1, projection=ccrs.Robinson()) world.plot(ax=ax, transform=ccrs.PlateCarree(), edgecolor='grey', facecolor='lightblue') ax.coastlines() # 添加海岸线 ax.gridlines() # 添加经纬网格 plt.show() ``` ![带投影的地图示例](https://via.placeholder.com/400x200.png?text=投影地图)[^1] --- ### 7. **绘制散点图或统计图** 通过`kind`参数切换绘图类型: ```python # 绘制人口与GDP的散点图 gdf = world.head(10) gdf.plot(kind='scatter', x='pop_est', y='gdp_md_est', c='red', s=100, title="Top 10国家人口与GDP关系") plt.show() ``` ![散点图示例](https://via.placeholder.com/400x200.png?text=散点图)[^2] --- ### 8. **导出地图** 保存为图片或矢量文件: ```python plt.savefig('world_map.png', dpi=300, bbox_inches='tight') ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值