[PYTHON] Verwenden Sie Cartopy mit Google Colaboratory, ohne an Fehlern zu leiden

Wenn Sie mit Python (Pandas oder NumPy) Datenwissenschaft betreiben möchten, verwenden Sie derzeit de mato matplotlib als Zeichnungsbibliothek und [zum Zeichnen von Geodaten und Karten Es ist besser, Cartopy zu verwenden. Die Kopie ist 2020 - wenn ich versuche, sie mit Google Colaboratory zu verwenden, bei dem es sich um Jupyter-Notizbuch in der Google Cloud handelt. 04 Derzeit ist die offizielle Methode von Fehlern geplagt und praktisch unbrauchbar. Hier finden Sie eine Zusammenfassung der Problemumgehungen und ihrer Erklärungen.

Fazit

Installieren Sie mit einer der folgenden Möglichkeiten.

Muster 1

!grep '^deb ' /etc/apt/sources.list | \
  sed 's/^deb /deb-src /g' | \
  tee /etc/apt/sources.list.d/deb-src.list
!apt-get -qq update

!apt-get -qq build-dep python3-cartopy
!pip uninstall -y shapely

!pip install --no-binary cartopy cartopy==0.17.0

Muster 2

!grep '^deb ' /etc/apt/sources.list | \
  sed 's/^deb /deb-src /g' | \
  tee /etc/apt/sources.list.d/deb-src.list
!apt-get update

!apt-get -qq build-dep python3-cartopy
!apt-get -qq remove python-shapely python3-shapely

!pip install --no-binary shapely shapely --force
!pip install --no-binary cartopy cartopy==0.17.0

Ich mache mir Sorgen um Fehler, wenn es die offizielle Methode ist

Das offizielle Google Colaboratory-Notizbuch (https://colab.research.google.com/notebooks/snippets/importing_libraries.ipynb) enthält folgende Betriebssystemverpackung: Es soll mit dem System apt möglich sein.

!apt-get -qq install python-cartopy python3-cartopy
import cartopy

Die auf diese Weise installierte Kartusche weist jedoch einen Fehler auf, der mit einem einfachen Code wie dem folgenden gelöscht werden kann:

Problem 1: gridlines () schlägt fehl

Ich kann das Raster nicht zeichnen, da bei gridlines () eine Fehlermeldung angezeigt wird.

Beispielcode:

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

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

Error:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-4-3e1ebed7d096> in <module>()
      3 
      4 ax = plt.axes(projection=ccrs.PlateCarree())
----> 5 ax.gridlines()
      6 ax.coastlines()

4 frames
/usr/local/lib/python3.6/dist-packages/matplotlib/ticker.py in _validate_steps(steps)
   2108         steps = np.asarray(steps)
   2109         if np.any(np.diff(steps) <= 0) or steps[-1] > 10 or steps[0] < 1:
-> 2110             raise ValueError('steps argument must be an increasing sequence '
   2111                              'of numbers between 1 and 10 inclusive')
   2112         if steps[0] != 1:

ValueError: steps argument must be an increasing sequence of numbers between 1 and 10 inclusive

Problem 2: Fallen Sie mit Küsten ()

Das Zeichnen einer Küstenlinie mit "Küstenlinien ()" führt zu "Sitzung aus unbekanntem Grund abgestürzt" mit dem folgenden Laufzeitprotokoll:

Beispielcode:

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

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

Fehlerprotokoll (Laufzeitprotokoll):

Apr 14, 2020, 6:18:57 PM	WARNING	warn("IPython.utils.traitlets has moved to a top-level traitlets package.")
Apr 14, 2020, 6:18:57 PM	WARNING	/usr/local/lib/python3.6/dist-packages/IPython/utils/traitlets.py:5: UserWarning: IPython.utils.traitlets has moved to a top-level traitlets package.
Apr 14, 2020, 6:18:57 PM	WARNING	WARNING:root:kernel e5263554-c566-4983-aea5-418e4cb6441a restarted
Apr 14, 2020, 6:18:57 PM	INFO	KernelRestarter: restarting kernel (1/5), keep random ports
Apr 14, 2020, 6:18:54 PM	WARNING	python3: geos_ts_c.cpp:3991: int GEOSCoordSeq_getSize_r(GEOSContextHandle_t, const geos::geom::CoordinateSequence*, unsigned int*): Assertion `0 != cs' failed.

Ursache für jedes Problem

Frage 1

Die Ursache für Problem 1 ist, dass die installierte Cartopy so alt ist wie v0.14.2. Obwohl es in Cartopys Ausgabe Nr. 1374 gemeldet wurde, ist der Fehler selbst PR Nr. 773. Es wurde in / cartopy / pull / 773) behoben und wurde seit v0.16.0 im Februar 2018 behoben.

Übrigens ist v0.14.2 die im April 2016 veröffentlichte Version, und der Grund, warum eine so alte Version installiert wird, ist, dass das Betriebssystem Ubuntu 18.04.3 LTS ist. Wie LTS sagt, handelt es sich um eine langfristig unterstützte Version, und die erste Version, 18.04, wurde im April 2018 veröffentlicht. Da es sich um eine Langzeit-Support-Version handelt, können Sie sie lange Zeit mit Vertrauen verwenden. Wenn es sich jedoch um kleinere Software oder Software handelt, die noch nicht stabil ist, ist es ein wenig schwierig, die Version mit dem Fehler ständig zu verpacken und zu verwenden. (Siehe Paketinformationen).

In [1]: cartopy.__version__

Out[1]: '0.14.2'

In [2]: !cat /etc/os-release

Out[2]:
NAME="Ubuntu"
VERSION="18.04.3 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.3 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

Problem 2

Problem 2 ist, dass Cartopy und Shapely, die von Cartopy verwendet werden, unterschiedliche Versionen von GEOS verwenden und nicht kompatibel sind. Als Cartopy Ausgabe Nr. 871 und Ausgabe Nr. 1490 gemeldet. Problem Nr. 805 erläutert die grundlegende Antwort, wurde jedoch noch nicht behoben.

Wenn in Debian und Ubuntu die Version des Bibliothekspakets hochgefahren wird, werden die davon abhängigen Pakete neu erstellt, sodass sie nicht mit einer anderen Version der Bibliothek verknüpft werden sollten. Wenn Sie eine Cartopy mit apt einfügen, wird die vom Betriebssystem bereitgestellte Deb-Paketversion Shapely 1.6.4 in die damit verknüpfte Cartopy aufgenommen, wie unten gezeigt. Wenn diese Form verwendet wird, tritt kein Problem auf.

Deb-Pakete, die zu Beginn mit "apt-get install" eingegeben wurden:

python-pkg-resources (39.0.1-2 Ubuntu:18.04/bionic [all])
python-pyshp (1.2.12+ds-1 Ubuntu:18.04/bionic [all])
python-shapely (1.6.4-1 Ubuntu:18.04/bionic [amd64])
python-six (1.11.0-2 Ubuntu:18.04/bionic [all])
python-cartopy (0.14.2+dfsg1-2build3 Ubuntu:18.04/bionic [amd64])
python3-pkg-resources (39.0.1-2 Ubuntu:18.04/bionic [all])
python3-pyshp (1.2.12+ds-1 Ubuntu:18.04/bionic [all])
python3-shapely (1.6.4-1 Ubuntu:18.04/bionic [amd64])
python3-six (1.11.0-2 Ubuntu:18.04/bionic [all])
python3-cartopy (0.14.2+dfsg1-2build3 Ubuntu:18.04/bionic [amd64])

Wie unten gezeigt, scheint Google Colaboratory jedoch von Anfang an die neueste Version von Shapely v1.7.0 mit pip enthalten zu haben.

In [3]: !pip list | grep Shapely

Out[3]: Shapely                  1.7.0

Wenn Sie einfach in diesem Zustand importieren, ist die Kartusche passend und Shapely ist pip. Dies ist die Ursache für die Inkompatibilität. Es ist ein Ärger.

In [4]:
import shapely
shapely.__version__

Out[4]: '1.7.0'

Nebenbei: Wenn nur Problem 2 tatsächlich eine Gegenmaßnahme ist, ist es einfach.

In Bezug auf Problem 2 ist die Kombination von pip und apt schlecht, daher ist dies eigentlich einfach. Wenn Sie zu Beginn vor oder nach der Installation von "apt-get" Folgendes ausführen, verwendet Shapely diejenige, die Sie mit apt (deb-Version) eingegeben haben ("cartopy importieren" vor "pip uninstall"). Und beachten Sie, dass es darin "formschön" importiert wird).

!pip uninstall -y shapely

Gegenmaßnahme

Da die Ursache die oben genannte ist, ist die Politik der Gegenmaßnahmen wie folgt.

Tun Sie dies speziell.

  1. Löschen Sie die mit pip eingegebene Form
  2. Erstellen Sie die neueste Version von Cartopy aus der Quelle mit Pip unter Verwendung von GEOS mit Shapely Linked

apt-get build-dep

Beim Importieren aus der Quelle müssen abhängige Bibliotheken wie GEOS enthalten sein. Es ist mühsam, sie einzeln zu platzieren, daher werde ich dieses Mal "apt-get build-dep" verwenden.

apt-get build-dep ist ein Befehl, der das Deb-Paket installiert, das zum Erstellen des Quellpakets des angegebenen Deb-Pakets erforderlich ist. In diesem Fall wird die zum Erstellen von cartopy v0.17.0 erforderliche Umgebung basierend auf den Build-Informationen des Quellpakets des deb-Pakets von cartopy v0.14.2 vorbereitet. Wenn sich die Abhängigkeiten zwischen v0.14.2 und v0.17.0 ändern, funktioniert dies natürlich nicht. Wenn jedoch keine größeren Änderungen vorgenommen wurden, ist dies in Ordnung (diesmal hat es tatsächlich funktioniert).

Bearbeiten Sie apt sources.list

Dann möchte ich sofort zu "apt-get build-dep" gehen, aber selbst wenn ich es plötzlich ausführe, tritt ein Fehler auf.

In [5]: !apt-get build-dep cartopy

Out[5]:
Reading package lists... Done
E: Unable to find a source package for cartopy

Die von "apt-get build-dep" verwendeten Quellpaketinformationen sind "/ etc / apt / sources.list" (und "/ etc / apt / sources.list.d / *"). Dies ist die Quelleneinstellung für die Paketerfassung von apt. Das liegt daran, dass es standardmäßig auskommentiert ist.

In [6]: !grep deb /etc/apt/sources.list

Out[6]:
deb http://archive.ubuntu.com/ubuntu/ bionic main restricted
# deb-src http://archive.ubuntu.com/ubuntu/ bionic main restricted
deb http://archive.ubuntu.com/ubuntu/ bionic-updates main restricted
# deb-src http://archive.ubuntu.com/ubuntu/ bionic-updates main restricted
deb http://archive.ubuntu.com/ubuntu/ bionic universe
# deb-src http://archive.ubuntu.com/ubuntu/ bionic universe
deb http://archive.ubuntu.com/ubuntu/ bionic-updates universe
# deb-src http://archive.ubuntu.com/ubuntu/ bionic-updates universe
deb http://archive.ubuntu.com/ubuntu/ bionic multiverse
# deb-src http://archive.ubuntu.com/ubuntu/ bionic multiverse
deb http://archive.ubuntu.com/ubuntu/ bionic-updates multiverse
# deb-src http://archive.ubuntu.com/ubuntu/ bionic-updates multiverse
deb http://archive.ubuntu.com/ubuntu/ bionic-backports main restricted universe multiverse
# deb-src http://archive.ubuntu.com/ubuntu/ bionic-backports main restricted universe multiverse
# deb http://archive.canonical.com/ubuntu bionic partner
# deb-src http://archive.canonical.com/ubuntu bionic partner
deb http://security.ubuntu.com/ubuntu/ bionic-security main restricted
# deb-src http://security.ubuntu.com/ubuntu/ bionic-security main restricted
deb http://security.ubuntu.com/ubuntu/ bionic-security universe
# deb-src http://security.ubuntu.com/ubuntu/ bionic-security universe
deb http://security.ubuntu.com/ubuntu/ bionic-security multiverse
# deb-src http://security.ubuntu.com/ubuntu/ bionic-security multiverse
deb https://cloud.r-project.org/bin/linux/ubuntu bionic-cran35/

Dies ist die einzige Ursache. Sie können das Problem lösen, indem Sie einfach eine Datei vorbereiten, in der die mit "deb" beginnende Zeile durch "deb-src" ersetzt wird, und die Paketinformationen mit "apt-get update" aktualisieren.

In [7]:
!grep '^deb ' /etc/apt/sources.list | \
  sed 's/^deb /deb-src /g' | \
  tee /etc/apt/sources.list.d/deb-src.list
!apt-get -qq update

Dies wird auch das oben erwähnte "apt-get build-dep" bestehen.

Installation

Wenn Sie danach "pip install --no-binary" verwenden, um ohne Verwendung von Binärpaketen zu erstellen, wird das am Anfang beschriebene Verfahren verwendet. Ich denke, es gibt sowohl Fälle, in denen es kein Problem mit Shapely of apt gibt, als auch Fälle, in denen Sie die neueste Version verwenden möchten, die ursprünglich in Google Colaboratory enthalten war. Daher werde ich zwei Muster zeigen. Es ist eine gute Idee, es zu ändern, je nachdem, welche Form Sie verwenden möchten.

Muster 1: Bei Verwendung der Deb-Paketversion von apt Shapely (v1.6.4)

!grep '^deb ' /etc/apt/sources.list | \
  sed 's/^deb /deb-src /g' | \
  tee /etc/apt/sources.list.d/deb-src.list
!apt-get -qq update

!apt-get -qq build-dep python3-cartopy
!pip uninstall -y shapely

!pip install --no-binary cartopy cartopy==0.17.0

Muster 2: Bei Verwendung der neuesten Version von Shapely (v1.7.0) aus der Quelle

!grep '^deb ' /etc/apt/sources.list | \
  sed 's/^deb /deb-src /g' | \
  tee /etc/apt/sources.list.d/deb-src.list
!apt-get update

!apt-get -qq build-dep python3-cartopy
!apt-get -qq remove python-shapely python3-shapely

!pip install --no-binary shapely shapely --force
!pip install --no-binary cartopy cartopy==0.17.0

Funktionsprüfung

Beide Python-Programme in Frage 1 und 2 funktionieren einwandfrei. Die Wellen der offiziellen Galerie funktionieren ebenfalls wie unten gezeigt.

import matplotlib.pyplot as plt
import numpy as np

import cartopy.crs as ccrs


def sample_data(shape=(73, 145)):
    """Return ``lons``, ``lats`` and ``data`` of some fake data."""
    nlats, nlons = shape
    lats = np.linspace(-np.pi / 2, np.pi / 2, nlats)
    lons = np.linspace(0, 2 * np.pi, nlons)
    lons, lats = np.meshgrid(lons, lats)
    wave = 0.75 * (np.sin(2 * lats) ** 8) * np.cos(4 * lons)
    mean = 0.5 * np.cos(2 * lats) * ((np.sin(2 * lats)) ** 2 + 2)

    lats = np.rad2deg(lats)
    lons = np.rad2deg(lons)
    data = wave + mean

    return lons, lats, data


def main():
    fig = plt.figure(figsize=(10, 5))
    ax = fig.add_subplot(1, 1, 1, projection=ccrs.Mollweide())

    lons, lats, data = sample_data()

    ax.contourf(lons, lats, data,
                transform=ccrs.PlateCarree(),
                cmap='nipy_spectral')
    ax.coastlines()
    ax.set_global()
    plt.show()


main()

waves.png

Postscript (15.04.2020): Kehren Sie zum Ausgangszustand zurück

Da sich der Inhalt (Status) des Betriebssystem-Dateisystems während der Installation ändert, ist es besser zu wissen, wie Sie beim Versuch und bei der fehlerhaften Installation zum ursprünglichen Status zurückkehren können. Sie können es mit der folgenden Methode zurücksetzen.

  1. Wählen Sie im Menü "Laufzeit" die Option "Laufzeit auf Werkseinstellungen zurücksetzen"

Bei "Restart Runtime" befindet sich der Code-Ausführungsstatus im Ausgangszustand (nichts befindet sich im Speicher), das Dateisystem bleibt jedoch geändert.

Recommended Posts

Verwenden Sie Cartopy mit Google Colaboratory, ohne an Fehlern zu leiden
Verwendung des japanischen Spacy-Modells mit Google Colaboratory
Ich kann den Darknet-Befehl in Google Colaboratory nicht verwenden!
So verwenden Sie Google Colaboratory
■ [Google Colaboratory] Morphologische Analyse verwenden (janome)
■ [Google Colaboratory] Verwenden Sie die morphologische Analyse (MeCab)
In Google Colaboratory registrierte Snippets (Scraping)
Google-Labor
Verwenden Sie den Metabolic Disassembler in Google Colaboratory
Verwenden Sie Tensorflow in einer wurzellosen Umgebung
Verwendung von Google Test in C-Sprache
Verwenden Sie TPU und Keras mit Google Colaboratory
In Google Colaboratory registrierte Snippets (PDF-Textkonvertierung)
[Erklärung zur Implementierung] Verwendung der japanischen Version von BERT in Google Colaboratory (PyTorch)
So laden Sie Dateien in Google Drive mit Google Colaboratory
Erstellen einer Umgebung für die Verwendung von CaboCha mit Google Colaboratory
Zusammenfassung der Einrichtung von Google Colaboratory
Verwenden Sie config.ini mit Python
Verwenden Sie DataFrame in Java
Verwenden Sie Datumsangaben in Python
Verwenden Sie ujson in Anfragen
Verwenden Sie den Profiler in Python
Verwenden Sie "% tensorflow_version 2.x", wenn Sie TPU mit Tensorflow 2.1.0 in Colaboratory verwenden
Scraping von Google News-Suchergebnissen in Python (2) Verwenden Sie Beautiful Soup