Cartopy whl文件安装详细教程

一、下载whl文件

1. 准备工作:检查系统环境

# 查看Python版本
python --version

# 查看系统位数(Windows)
echo %PROCESSOR_ARCHITECTURE%

# 或者使用Python查看
python -c "import platform; print(f'系统: {platform.system()} {platform.architecture()[0]}')"

2. Cartopy依赖包(必须先安装)

Cartopy需要以下依赖,按顺序安装:

必需依赖whl文件(先安装这些):

  1. PROJ(地理投影库)
  2. GEOS(几何引擎)
  3. Shapely(几何操作)
  4. pyproj(坐标转换)

3. 下载(Windows用户)

首先为了顺利安装这个模块,我们需要下载whl文件,可以尝试去github搜仓库pythonlibs_whl_mirror,然后找到对应版本whl文件,之后进行一个步骤安装

4. 下载文件列表(按顺序下载)

包名推荐版本文件名示例
GEOS3.11.1GEOS-3.11.1-cp39-cp39-win_amd64.whl
Shapely1.8.5Shapely-1.8.5-cp39-cp39-win_amd64.whl
pyproj3.5.0pyproj-3.5.0-cp39-cp39-win_amd64.whl
Cartopy0.21.1Cartopy-0.21.1-cp39-cp39-win_amd64.whl

注意:将cp39替换为您的Python版本(如cp38cp310等)

二、安装步骤(必须按顺序)

步骤1:安装基础依赖

# 打开CMD,切换到下载目录
cd C:\Users\你的用户名\Downloads

# 1. 安装GEOS(必须先安装)
pip install GEOS-3.11.1-cp39-cp39-win_amd64.whl

# 2. 安装Shapely
pip install Shapely-1.8.5-cp39-cp39-win_amd64.whl

# 3. 安装pyproj
pip install pyproj-3.5.0-cp39-cp39-win_amd64.whl

步骤2:安装Cartopy

# 4. 安装Cartopy主包
pip install Cartopy-0.21.1-cp39-cp39-win_amd64.whl

步骤3:安装可选依赖(推荐)

# 安装matplotlib(用于绘图)
pip install matplotlib

# 安装pyshp(用于读取shapefile)
pip install pyshp

# 安装scipy(用于插值等操作)
pip install scipy

三、验证安装

测试1:基础导入测试

# test_cartopy_basic.py
print("=== Cartopy 基础测试 ===")

# 测试1:检查版本
try:
    import cartopy
    print(f"✓ Cartopy版本: {cartopy.__version__}")
except ImportError as e:
    print(f"✗ Cartopy导入失败: {e}")
    exit(1)

# 测试2:检查依赖
try:
    import shapely
    print(f"✓ Shapely版本: {shapely.__version__}")
except ImportError as e:
    print(f"✗ Shapely导入失败: {e}")

try:
    import pyproj
    print(f"✓ pyproj版本: {pyproj.__version__}")
except ImportError as e:
    print(f"✗ pyproj导入失败: {e}")

# 测试3:检查CRS(坐标参考系统)
try:
    import cartopy.crs as ccrs
    print("✓ 坐标参考系统模块可用")
except Exception as e:
    print(f"✗ CRS模块错误: {e}")

# 测试4:检查要素模块
try:
    import cartopy.feature as cfeature
    print("✓ 地理要素模块可用")
except Exception as e:
    print(f"✗ 要素模块错误: {e}")

print("\n✅ Cartopy基础测试完成")

测试2:简单地图绘制

# cartopy_simple_map.py
"""
Cartopy 简单地图绘制示例
绘制中国地图并标记主要城市
"""

import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeature
import numpy as np

def create_china_map():
    """创建中国地图"""
    print("正在创建中国地图...")
    
    # 1. 创建图形和坐标轴
    fig = plt.figure(figsize=(12, 8))
    
    # 使用PlateCarree投影(经纬度坐标)
    ax = plt.axes(projection=ccrs.PlateCarree())
    
    # 2. 设置地图范围(中国区域)
    ax.set_extent([70, 140, 15, 55], crs=ccrs.PlateCarree())
    
    # 3. 添加地理特征
    print("添加地理特征...")
    
    # 添加海岸线
    ax.add_feature(cfeature.COASTLINE.with_scale('50m'), linewidth=0.8)
    
    # 添加国界
    ax.add_feature(cfeature.BORDERS.with_scale('50m'), linewidth=0.5, linestyle=':')
    
    # 添加河流
    ax.add_feature(cfeature.RIVERS.with_scale('50m'), linewidth=0.5, alpha=0.5)
    
    # 添加湖泊
    ax.add_feature(cfeature.LAKES.with_scale('50m'), alpha=0.5)
    
    # 添加陆地颜色
    ax.add_feature(cfeature.LAND.with_scale('50m'), facecolor='lightgray', alpha=0.3)
    
    # 添加海洋颜色
    ax.add_feature(cfeature.OCEAN.with_scale('50m'), facecolor='lightblue', alpha=0.3)
    
    # 4. 标记中国主要城市
    cities = {
        '北京': (116.4, 39.9),
        '上海': (121.47, 31.23),
        '广州': (113.23, 23.16),
        '成都': (104.06, 30.67),
        '武汉': (114.31, 30.52),
        '西安': (108.94, 34.26),
        '哈尔滨': (126.53, 45.80),
        '乌鲁木齐': (87.62, 43.82),
        '拉萨': (91.11, 29.65),
        '海口': (110.35, 20.02)
    }
    
    print("标记主要城市...")
    for city, (lon, lat) in cities.items():
        ax.plot(lon, lat, 'ro', markersize=6, transform=ccrs.PlateCarree())
        ax.text(lon + 0.5, lat + 0.5, city, 
                transform=ccrs.PlateCarree(),
                fontsize=9,
                fontproperties='SimHei' if city in ['北京', '上海', '广州'] else 'Arial',
                bbox=dict(boxstyle="round,pad=0.2", facecolor="yellow", alpha=0.5))
    
    # 5. 添加网格线
    gl = ax.gridlines(draw_labels=True, linewidth=0.5, color='gray', alpha=0.5, linestyle='--')
    gl.top_labels = False
    gl.right_labels = False
    
    # 6. 添加标题
    plt.title('中国地图 - 主要城市分布', fontsize=16, fontweight='bold', pad=20)
    
    # 7. 保存图片
    plt.savefig('china_map.png', dpi=300, bbox_inches='tight')
    print("地图已保存为 'china_map.png'")
    
    plt.show()
    
    return fig, ax

def test_projection():
    """测试不同地图投影"""
    print("\n=== 测试不同地图投影 ===")
    
    projections = [
        ('PlateCarree', ccrs.PlateCarree(), "等经纬度投影"),
        ('Robinson', ccrs.Robinson(), "罗宾逊投影"),
        ('Mercator', ccrs.Mercator(), "墨卡托投影"),
        ('Orthographic', ccrs.Orthographic(central_longitude=105, central_latitude=35), "正射投影(中国视角)"),
        ('LambertConformal', ccrs.LambertConformal(central_longitude=105, central_latitude=35), "兰伯特正形圆锥投影")
    ]
    
    fig = plt.figure(figsize=(15, 10))
    
    for i, (name, proj, desc) in enumerate(projections, 1):
        ax = fig.add_subplot(2, 3, i, projection=proj)
        
        # 设置中国区域
        if name != 'Orthographic':
            ax.set_extent([70, 140, 15, 55], crs=ccrs.PlateCarree())
        
        # 添加特征
        ax.add_feature(cfeature.COASTLINE.with_scale('50m'), linewidth=0.5)
        ax.add_feature(cfeature.BORDERS.with_scale('50m'), linewidth=0.3, linestyle=':')
        ax.add_feature(cfeature.LAND.with_scale('50m'), facecolor='lightgray', alpha=0.3)
        
        # 标记北京
        ax.plot(116.4, 39.9, 'ro', markersize=4, transform=ccrs.PlateCarree())
        
        ax.set_title(f'{name}\n{desc}', fontsize=10)
    
    plt.suptitle('Cartopy 不同地图投影对比', fontsize=16, fontweight='bold')
    plt.tight_layout()
    plt.savefig('projections.png', dpi=300)
    print("投影测试图已保存为 'projections.png'")
    plt.show()

if __name__ == "__main__":
    try:
        print("=" * 60)
        print("Cartopy 安装测试和示例")
        print("=" * 60)
        
        # 测试1:创建中国地图
        fig1, ax1 = create_china_map()
        
        # 测试2:测试不同投影
        test_projection()
        
        print("\n" + "=" * 60)
        print("✅ Cartopy 安装成功!所有功能正常")
        print("=" * 60)
        
    except Exception as e:
        print(f"\n❌ 发生错误: {e}")
        import traceback
        traceback.print_exc()

测试3:高级功能示例

# cartopy_advanced_demo.py
"""
Cartopy 高级功能示例
包含数据可视化、自定义特征和交互功能
"""

import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeature
import numpy as np
from matplotlib.colors import LinearSegmentedColormap

def temperature_map():
    """创建温度分布图"""
    print("创建温度分布图...")
    
    # 创建自定义颜色映射
    colors = ['blue', 'cyan', 'green', 'yellow', 'red']
    cmap = LinearSegmentedColormap.from_list('temperature', colors, N=256)
    
    # 创建图形
    fig = plt.figure(figsize=(14, 8))
    ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree())
    
    # 设置全球范围
    ax.set_global()
    
    # 添加基础特征
    ax.add_feature(cfeature.COASTLINE, linewidth=0.5)
    ax.add_feature(cfeature.LAND, facecolor='lightgray', alpha=0.3)
    ax.add_feature(cfeature.OCEAN, facecolor='lightblue', alpha=0.3)
    
    # 模拟温度数据
    lons = np.linspace(-180, 180, 360)
    lats = np.linspace(-90, 90, 180)
    lon_grid, lat_grid = np.meshgrid(lons, lats)
    
    # 创建模拟温度分布(简单模型)
    # 假设温度随纬度变化,赤道最热,两极最冷
    temperature = 30 * np.cos(np.deg2rad(lat_grid)) + np.random.randn(*lat_grid.shape) * 5
    
    # 绘制温度分布
    contour = ax.contourf(lon_grid, lat_grid, temperature, 
                         levels=20, cmap=cmap,
                         transform=ccrs.PlateCarree(),
                         alpha=0.7)
    
    # 添加等温线
    ax.contour(lon_grid, lat_grid, temperature,
               levels=10, colors='black',
               linewidths=0.5, transform=ccrs.PlateCarree(),
               alpha=0.5)
    
    # 添加色标
    cbar = plt.colorbar(contour, ax=ax, orientation='horizontal', 
                       pad=0.05, shrink=0.8)
    cbar.set_label('Temperature (°C)', fontsize=12)
    
    # 添加标题
    plt.title('Global Temperature Distribution (Simulated)', 
              fontsize=16, fontweight='bold', pad=20)
    
    # 添加网格
    gl = ax.gridlines(draw_labels=True, linewidth=0.5, 
                      color='gray', alpha=0.5, linestyle='--')
    gl.top_labels = False
    gl.right_labels = False
    
    plt.tight_layout()
    plt.savefig('temperature_map.png', dpi=300)
    print("温度分布图已保存为 'temperature_map.png'")
    plt.show()

def custom_features():
    """创建自定义地理特征"""
    print("\n创建自定义地理特征图...")
    
    fig = plt.figure(figsize=(12, 8))
    
    # 使用兰伯特投影显示美国
    projection = ccrs.LambertConformal(central_longitude=-96, central_latitude=39)
    ax = fig.add_subplot(1, 1, 1, projection=projection)
    
    # 设置美国范围
    ax.set_extent([-125, -66, 24, 50], crs=ccrs.PlateCarree())
    
    # 添加高分辨率特征
    ax.add_feature(cfeature.STATES.with_scale('50m'), linewidth=0.3, edgecolor='gray')
    ax.add_feature(cfeature.COASTLINE.with_scale('50m'), linewidth=0.8)
    ax.add_feature(cfeature.BORDERS.with_scale('50m'), linewidth=1)
    
    # 添加主要河流
    ax.add_feature(cfeature.RIVERS.with_scale('50m'), linewidth=0.5, edgecolor='blue', alpha=0.6)
    
    # 添加湖泊
    ax.add_feature(cfeature.LAKES.with_scale('50m'), facecolor='blue', alpha=0.3)
    
    # 标记主要城市
    us_cities = {
        'New York': (-74.0, 40.7),
        'Los Angeles': (-118.2, 34.1),
        'Chicago': (-87.6, 41.9),
        'Houston': (-95.4, 29.8),
        'Miami': (-80.2, 25.8),
        'Seattle': (-122.3, 47.6)
    }
    
    for city, (lon, lat) in us_cities.items():
        ax.plot(lon, lat, 's', color='red', markersize=8, 
                transform=ccrs.PlateCarree())
        ax.text(lon + 0.5, lat + 0.5, city, 
                transform=ccrs.PlateCarree(),
                fontsize=9, fontweight='bold',
                bbox=dict(boxstyle="round,pad=0.2", facecolor="white", alpha=0.8))
    
    # 添加自定义区域(比如标记中部平原)
    from cartopy.mpl.patch import geos_to_path
    import matplotlib.patches as mpatches
    
    # 创建一个简单的矩形区域(示例)
    rectangle = mpatches.Rectangle((-105, 35), 10, 10, 
                                   facecolor='green', alpha=0.2,
                                   transform=ccrs.PlateCarree())
    ax.add_patch(rectangle)
    ax.text(-100, 40, 'Great Plains', 
            transform=ccrs.PlateCarree(),
            fontsize=10, style='italic')
    
    plt.title('United States - Major Cities and Features', 
              fontsize=16, fontweight='bold')
    
    # 添加比例尺
    import matplotlib.transforms as mtransforms
    ax.add_artist(mpatches.Rectangle((-120, 25), 10, 1, 
                                     facecolor='black',
                                     transform=ccrs.PlateCarree()))
    ax.text(-115, 26.5, '1000 km', 
            transform=ccrs.PlateCarree(),
            fontsize=8)
    
    plt.tight_layout()
    plt.savefig('us_map_custom.png', dpi=300)
    print("自定义特征图已保存为 'us_map_custom.png'")
    plt.show()

if __name__ == "__main__":
    try:
        print("=" * 60)
        print("Cartopy 高级功能演示")
        print("=" * 60)
        
        # 运行示例
        temperature_map()
        custom_features()
        
        print("\n" + "=" * 60)
        print("✅ Cartopy 高级功能测试完成!")
        print("=" * 60)
        
    except Exception as e:
        print(f"\n❌ 发生错误: {e}")
        import traceback
        traceback.print_exc()

四、常见错误解决

错误1:缺少依赖

ModuleNotFoundError: No module named 'shapely'

解决:确保按顺序安装了所有依赖包

错误2:PROJ版本问题

CRSError: Invalid projection: epsg:xxxx

解决

# 更新PROJ数据(在线运行)
pip install pyproj
python -c "import pyproj; pyproj.datadir.set_data_dir(pyproj.datadir.get_data_dir())"

错误3:whl文件不兼容

ERROR: Cartopy-0.21.1-cp39-cp39-win_amd64.whl is not a supported wheel on this platform

解决

  1. 确认Python版本:python --version
  2. 确认系统位数:64位系统用win_amd64,32位用win32
  3. 下载对应版本的whl文件

错误4:安装顺序错误

如果安装顺序错误,需要完全卸载后重新安装:

# 卸载所有相关包
pip uninstall cartopy shapely pyproj -y

# 删除缓存
pip cache purge

# 按正确顺序重新安装
pip install GEOS-*.whl
pip install Shapely-*.whl
pip install pyproj-*.whl
pip install Cartopy-*.whl

五、运行测试

# 运行基础测试
python test_cartopy_basic.py

# 运行简单地图示例
python cartopy_simple_map.py

# 运行高级示例
python cartopy_advanced_demo.py

六、注意事项

  1. 安装顺序至关重要:必须按 GEOS → Shapely → pyproj → Cartopy 顺序安装
  2. Python版本匹配:所有whl文件的Python版本必须一致
  3. 系统架构一致:所有包必须都是64位或都是32位
  4. 网络问题:如果从UCI下载,有时需要尝试多个版本
  5. 数据文件:Cartopy第一次运行时可能需要下载地图数据,确保网络畅通

按照这个流程,您应该能成功安装并使用Cartopy进行地理数据可视化!

更多推荐