用pip安装cartopy(windows平台),解决GEOS库的问题

news2025/1/19 22:29:52

对象:cartopy

Cartopy官方网站介绍:

Cartopy is a Python package designed for geospatial data processing in order to produce maps and other geospatial data analyses.

Cartopy是一个Python包,旨在进行地理空间数据处理,以生成地图和其他地理空间数据分析。

Cartopy makes use of the powerful PROJ, NumPy and Shapely libraries and includes a programmatic interface built on top of Matplotlib for the creation of publication quality maps.

Cartopy使用强大的PROJ,NumPy和Shapely库,并包括在Matplotlib之上构建的用于创建出版质量地图的编程接口。

Key features of cartopy are its object oriented projection definitions, and its ability to transform points, lines, vectors, polygons and images between those projections.

主要功能是其面向对象的投影定义,以及在这些投影之间转换点,线,矢量,多边形和图像的能力。

You will find cartopy especially useful for large area / small scale data, where Cartesian assumptions of spherical data traditionally break down. If you’ve ever experienced a singularity at the pole or a cut-off at the dateline, it is likely you will appreciate cartopy’s unique features!

Cartopy在以下方面特别有用:大面积/小比例尺数据,其中球形数据的笛卡尔假设传统上会崩溃。如果您曾经在极点经历过奇点或在日期线上截断,那么您可能会欣赏cartopy的独特功能!

问题

  • windows平台
  • 用pip安装cartopy
  • 编译过程无法通过,错误提示:找不到geos_c.h

解决步骤

其他贴子里提到的安装的问题,多半是集中在几个py包,实际上唯一存在问题是geos库。其他包,pypi的源都已经解决了。

前提:

  • 安装microsoft visual studio社区版
  • 安装cmake

步骤:

  1. 下载libgeos源码
  2. 解压源代码
  3. 运行msvc的x64 Native Tools Command Prompt for VS 2022
  4. 切换到源代码目录:geos-3.11.2
  5. mkdir build
  6. cd build
  7. cmake ..
  8. msbuild GOES.slu -property:configuration=Release
  9. 等待完成之后激活要安装的python环境,xxx/venv/Script/activate
  10. set PATH=%PATH%;C:\prjs\geos-3.11.2\build\bin\Release
  11. set LIB=%LIB%;C:\prjs\geos-3.11.2\build\lib\Release
  12. set INCLUDE=%INCLUDE%;C:\prjs\geos-3.11.2\build\capi;C:\prjs\geos-3.11.2\include
  13. 接下来就直接安装cartopy,pip install cartopy
  14. 其中要涉及到编译环节,按照上面的设置就可以顺利通过;
  15. 安装好之后,如果在这个命令行窗口里,可能不存在问题,因为已经设置了PATH,换个终端还在运行import cartopy提示dll找不到:
    1. 就把C:\prjs\geos-3.11.2\build\bin\Release目录下的两个dll文件geos.dllgeos_c.dll拷贝到,对应的venv/Lib/site-packages/cartopy目录下
    2. C:\prjs\geos-3.11.2\build\bin\Release添加到系统的目录下。

例子

安装好了之后就可以运行一大堆例子:

def plot_carree():
    ax = plt.axes(projection=ccrs.PlateCarree())
    ax.coastlines()

    # Save the plot by calling plt.savefig() BEFORE plt.show()
    plt.savefig('coastlines.pdf')
    plt.savefig('coastlines.png', dpi=600)

    plt.show()


def plot_data():
    ax = plt.axes(projection=ccrs.PlateCarree())
    ax.stock_img()

    ny_lon, ny_lat = -75, 43
    delhi_lon, delhi_lat = 77.23, 28.61

    plt.plot([ny_lon, delhi_lon], [ny_lat, delhi_lat],
             color='blue', linewidth=2, marker='o',
             transform=ccrs.Geodetic(),
             )

    plt.plot([ny_lon, delhi_lon], [ny_lat, delhi_lat],
             color='gray', linestyle='--',
             transform=ccrs.PlateCarree(),
             )

    plt.text(ny_lon - 3, ny_lat - 12, 'New York',
             horizontalalignment='right',
             transform=ccrs.Geodetic())

    plt.text(delhi_lon + 3, delhi_lat - 12, 'Delhi',
             horizontalalignment='left',
             transform=ccrs.Geodetic())

    plt.show()


def plot_sphere():
    ax = plt.axes(projection=ccrs.Mollweide())
    ax.stock_img()
    plt.show()


import os

from cartopy import config
from scipy.io import netcdf_file


def plot_contour():
    # get the path of the file. It can be found in the repo data directory.
    fname = os.path.join(config["repo_data_dir"],
                         'netcdf', 'HadISST1_SST_update.nc'
                         )

    dataset = netcdf_file(fname, maskandscale=True, mmap=False)
    sst = dataset.variables['sst'][0, :, :]
    lats = dataset.variables['lat'][:]
    lons = dataset.variables['lon'][:]

    ax = plt.axes(projection=ccrs.PlateCarree())

    plt.contourf(lons, lats, sst, 60,
                 transform=ccrs.PlateCarree())

    ax.coastlines()

    plt.show()


def plot_fig():
    fig = plt.figure(figsize=(8, 12))

    # get the path of the file. It can be found in the repo data directory.
    fname = os.path.join(config["repo_data_dir"],
                         'raster', 'sample', 'Miriam.A2012270.2050.2km.jpg'
                         )
    img_extent = (-120.67660000000001, -106.32104523100001, 13.2301484511245, 30.766899999999502)
    img = plt.imread(fname)

    ax = plt.axes(projection=ccrs.PlateCarree())
    plt.title('Hurricane Miriam from the Aqua/MODIS satellite\n'
              '2012 09/26/2012 20:50 UTC')

    ax.use_sticky_edges = False
    # set a margin around the data
    ax.set_xmargin(0.05)
    ax.set_ymargin(0.10)

    # add the image. Because this image was a tif, the "origin" of the image is in the
    # upper left corner
    ax.imshow(img, origin='upper', extent=img_extent, transform=ccrs.PlateCarree())
    ax.coastlines(resolution='50m', color='black', linewidth=1)

    # mark a known place to help us geo-locate ourselves
    ax.plot(-117.1625, 32.715, 'bo', markersize=7, transform=ccrs.Geodetic())
    ax.text(-117, 33, 'San Diego', transform=ccrs.Geodetic())

    plt.show()


def plot_tick():
    rotated_crs = ccrs.RotatedPole(pole_longitude=120.0, pole_latitude=70.0)

    ax = plt.axes(projection=rotated_crs)
    ax.set_extent([-6, 3, 48, 58], crs=ccrs.PlateCarree())
    ax.coastlines(resolution='50m')
    ax.gridlines(draw_labels=True, dms=True, x_inline=False, y_inline=False)

    plt.show()


import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
import cartopy.crs as ccrs

from cartopy.mpl.ticker import (LongitudeFormatter, LatitudeFormatter,
                                LatitudeLocator)


def plot_ticker():
    ax = plt.axes(projection=ccrs.Mercator())
    ax.coastlines()

    gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True,
                      linewidth=2, color='gray', alpha=0.5, linestyle='--')
    gl.top_labels = False
    gl.left_labels = False
    gl.xlines = False
    gl.xlocator = mticker.FixedLocator([-180, -45, 0, 45, 180])
    gl.ylocator = LatitudeLocator()
    gl.xformatter = LongitudeFormatter()
    gl.yformatter = LatitudeFormatter()
    gl.xlabel_style = {'size': 15, 'color': 'gray'}
    gl.xlabel_style = {'color': 'red', 'weight': 'bold'}

    plt.show()


if __name__ == '__main__':
    plot_ticker()

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结

  1. windows下也可以从源程序编译libgeos;
  2. 虽然没有linux下面方便,但是也基本能用;
  3. cartopy真是好用啊……

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/556228.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Metersphere+jar+beanshell+连接linux

Meterspherejarbeanshell连接linux java编写连接linux代码 使用jsch连接linux&#xff0c;下载jsch包或者使用maven <dependencies><dependency><groupId>com.jcraft</groupId><artifactId>jsch</artifactId><version>0.1.55<…

小航助学GESP_C++二级模式测试试卷(含题库答题软件账号)

GESP在线模拟训练系统请点击 电子学会-全国青少年编程等级考试真题Scratch一级&#xff08;2019年3月&#xff09;在线答题_程序猿下山的博客-CSDN博客_小航答题助手 答案:A 第1题人们在使用计算机时所提到的 Windows 通常指的是&#xff08;&#xff09;。 A、操作系统B、多…

就业内推 | 国企中电福富专场!多地有岗,CCIE、HCIE认证优先

01 中电福富信息科技有限公司 &#x1f537;招聘岗位&#xff1a;网络工程师&#xff08;北京&#xff09; &#x1f537;职责描述&#xff1a; 1、负责云平台、数据中心网络架构的调整和性能优化&#xff0c;确保网络的性能、稳定和安全性&#xff1b; 2、对网络突发事件、网…

力扣LCP 33. 蓄水

LCP 33. 蓄水 给定 N 个无限容量且初始均空的水缸&#xff0c;每个水缸配有一个水桶用来打水&#xff0c;第 i 个水缸配备的水桶容量记作 bucket[i]。有以下两种操作&#xff1a; 升级水桶&#xff1a;选择任意一个水桶&#xff0c;使其容量增加为 bucket[i]1 蓄水&#xff1…

JVM基础学习---2、总体机制中不重要的部分、方法区、虚拟机栈

1、总体机制中不重要的部分 1.1 本地接口 Native Interface 本地接口的作用是融合不同的编程语言为 Java 所用&#xff0c;它的初衷是融合 C/C程序。因为 Java 诞生的时候是 C/C 横行的时候&#xff0c;要想立足&#xff0c;必须有能力调用 C/C。于是就在内存中专门开辟了一块…

PCB~电磁干扰

电磁辐射 • 两个主要的电磁来源 • 电流穿过一个金属会产生一个磁场 • 在磁场中放置一个磁场会产生感应电流 • 导体的形状会影响流经它的电流所产生的磁场强度&#xff0c;反之变然 EMI&#xff1a;电磁干扰 • EMI:Electro-Magnetic Interference • EMI代表的是一个设…

自动构建之CMake

CMake 链接: 自动构建之MakeFile CMake也是一种用于自动化构建软件项目的工具。Cmake可以自动输出MakeFile文件&#xff0c;并且CMake是一个跨平台的构建系统&#xff0c;对于复杂的、跨平台的项目&#xff0c;CMake可能是一个更好的解决方案。 CMake的脚本文件是在CMakeLis…

chatgpt赋能Python-python_can

Python-CAN: 一个用于控制CAN总线通信的Python工具 什么是CAN总线&#xff1f; Controller Area Network&#xff08;CAN&#xff09;是用于控制器之间通信的一种通信协议。它经常用于汽车、工业自动化和机器人等领域。CAN总线可以连接多个设备&#xff0c;这些设备可以通过总…

离谱,入职比亚迪一个月,我算是开眼了..

去年校招寒冬很多人都收到BYD的offer&#xff0c;看多了把BYD当爷爷拜的分享了&#xff0c;这里我就做个坏人来泼盆冷水。 以下情况仅仅适用于我从同部门同事和室友了解到的&#xff0c;至于这种情况适不适用于整个厂&#xff0c;就看各位怎么理解了。 当然也不是硬黑硬洗&am…

力扣sql中等篇练习(二十四)

力扣sql中等篇练习(二十四) 1 商店中每个成员的级别 1.1 题目内容 1.1.1 基本题目信息1 1.1.2 基本题目信息2 1.1.3 示例输入输出 a 示例输入 b 示例输出 1.2 示例sql语句 SELECT m.member_id,m.name,case when t.r is null then Bronzewhen t.r>0 AND t.r<50 then …

使用CMake+vcpkg生成VS2022工程——以开源库openMVS为例

使用CMakevcpkg生成VS2022工程——以开源库openMVS为例 背景 想在openMVS应用的基础上做一些改造&#xff0c;于是下载了其开源代码。为了改造它&#xff0c;首先要了解程序执行流程&#xff0c;要是能在VS里以debug模式来运行就好了&#xff01; 过去接触的开源软件/库的编译…

Codeforces Round 835 (Div. 4) Tutorial (zh)

题目链接 A. Medium Number 题意&#xff1a; 给三个数 a , b , c a,b,c a,b,c&#xff0c;找出中间的那个数 eg. a ≤ b ≤ c a \leq b \leq c a≤b≤c 输出 b b b Example input 9 5 2 6 14 3 4 20 2 1 1 2 3 11 19 12 10 8 20 6 20 3 4 1 3 19 8 4output 5 4 2 2 12 10 …

[Nacos] Nacos Client获取调用服务的提供者列表 (四)

文章目录 1.Nacos Client获取调用服务的提供者列表1.1 从Ribbon的负载均衡入手到Nacos Client获取调用服务的提高者列表1.2 getServers方法返回分析1.3 通过selectInstances方法查找Instances实例1.4 获取到要调用服务的serviceInfo Nacos Client 从Ribbon负载均衡调用服务。 …

无公网IP,SSH远程连接Linux CentOS

转载自cpolar内网穿透的文章&#xff1a;无公网IP&#xff0c;SSH远程连接Linux CentOS【内网穿透】 本次教程我们来实现如何在外公网环境下&#xff0c;SSH远程连接家里/公司的Linux CentOS服务器&#xff0c;无需公网IP&#xff0c;也不需要设置路由器。 视频教程 【SSH远程…

汇编十二、定时/计数器

1、功能 定时器/计数器的核心部件是一个加法(也有减法)的计数器&#xff0c;其本质是对脉冲进行计数。只是计数脉冲来源不同&#xff1a;如果计数脉冲来自系统时钟&#xff0c;则为定时方式&#xff0c;此时定时器/计数器每12个时钟周期或者每6个时钟周期得到一个计数脉冲&…

Sentinel简介和安装

1.Sentinel简介 官方Github 官方中文文档Github 官方文档 1.1.Sentinel 是什么&#xff1f; 随着微服务的流行&#xff0c;服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点&#xff0c;从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 …

HTB-Agile

HTB-Agile 信息收集80端口漫长的兔子洞之旅 立足www-data -> corumcorum -> edwardsedwards -> root 信息收集 80端口 漫长的兔子洞之旅 我注意到系统为我分配了一个session&#xff0c;是以eyj开头的。 拿去jwt.io看看。 额&#xff0c;可能后面会用先留在这&#…

实验5 单选多选、进度条、图像显示等组件使用

实验内容和步骤 以下习题需要自己设计界面内容&#xff0c;尽量丰富&#xff0c;并且突出创新和亮点&#xff0c;不可简单仿照例题。 1.设计并实现音乐播放器的进度条界面。 2.设计并实现含有多选控件的界面。 3.设计并实现含有单选控件的界面。 4.设计并实现含有图像显示的界…

华为OD机试真题 Java 实现【去除多余空格】【2023Q1 200分】

一、题目描述 去除文本多余空格&#xff0c;但不去除配对单引号之间的多余空格。给出关键词的起始和结束下标&#xff0c;去除多余空格后刷新关键词的起始和结束下标。 条件约束&#xff1a; 不考虑关键词起始和结束位置为空格的场景&#xff1b;单词的的开始和结束下标保证…

springboot项目:瑞吉外卖 前后端 代码、思路 详细分析 part6

part1 part2 part3 part4 part5 part6(本页) 7. 菜品展示、购物车、下单 功能开发 7.1 导入用户地址簿相关功能代码 7.2 菜品展示 7.3 购物车 7.4 下单 7.1 导入用户地址簿相关功能代码 7.1.1 整体分析 需求分析 数据模型需要开发的模块&#xff1a;新增收获地址、设置默认…