0
votes

Comment tracer un polygone rempli sur une carte en cartopie

édité, ajoutant une suggestion d'une réponse

J'ai une liste de sommets dans la Lat / Lon qui définissent les coins d'un polygone sur une carte. Je voudrais dessiner ce polygone sur une carte en utilisant la cartopie, où les bords sont de grands cercles. J'ai essayé de suivre les exemples à HTTPS: //scitools.org.uk/cartopy/docs/v0.5/matplotlib/introductory_examples/02.polygon.html , mais je ne peux pas le faire fonctionner. Voici ce que j'ai essayé jusqu'à présent: xxx

image de sortie

Notez que les lignes ne sont pas de grands cercles et Il semble y avoir plus de quatre sommets. J'ai l'impression que ceci est une chose si simple à faire là-bas doit y avoir un moyen, mais je ne peux pas comprendre cela de la documentation de la cartopie.


0 commentaires

3 Réponses :


0
votes

esprit, que l'exemple utilise xxx


8 commentaires

Maintenant, je vois les côtes, mais le polygone est toujours faux (voir ma question modifiée)


Oui, apparemment, le polygone n'a pas été mis en œuvre en cartopie. Pourquoi ne pas utiliser un rectangle à la place?


J'ai besoin de tracer des cellules de grille de modèles de circulation définies sur des grilles non-lon, telles que la sphère cubes et les grilles icosaèdrales. Ce ne sont pas des rectangles, même si certains d'entre eux ont quatre sommets.


Dans ce cas, pouvez-vous augmenter la résolution du polygone. Je veux dire, dans le cas extrême, vous pouvez fournir un polygone avec un point tous les 100 km environ.


Je suppose que je pourrais le faire, mais cela impliquerait-moi informer tous les points intermédiaires, ce qui implique de réinventer la roue (c'est-à-dire de tirer de grands cercles). Depuis que le titre de l'exemple de page a dit "dessiner un polygone géodésique", j'avais espéré qu'il fonctionnerait réellement pour un polygone :-(


Votre polygone serait alors décrit par 4 grands cercles? Dans ce cas, tracer ces quatre bords du polygone peut-être individuellement être une option?


Correct, sauf que j'ai besoin de dessiner un polygone rempli. Je n'ai pas ajouté le remplissage dans l'exemple car il n'a pas dessiné le polygone correctement pour commencer.


Je suggérerais ce qui suit: vous mettrez tout ce qui est discuté ici à l'intérieur de la question; Une fois que cela fait, je supprimerais cette réponse, de sorte que la question reste vierge et claire.



1
votes

Je pense que c'est probablement parce que la résolution de transformation par défaut de caricot est trop faible pour cette projection. Vous pouvez contourner cela en forçant une résolution plus élevée:

map_proj = ccrs.Orthographic(central_latitude=0.0, central_longitude=80.0)
map_proj._threshold /= 100.
...


0 commentaires

0
votes

Voici un code et une sortie runnable. Crédits Allez à: L'Asker, la SocietyEbeingNest, et Ajdawson.

import numpy as np
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import matplotlib.patches as mpatches

map_proj = ccrs.Orthographic(central_latitude=0.0, central_longitude=80.0)

map_proj._threshold /= 100.  # the default values is bad, users need to set them manually

ax = plt.axes(projection=map_proj)

ax.set_global() # added following an answer to my question
ax.gridlines()

ax.coastlines(linewidth=0.5, color='k', resolution='50m')

lat_corners = np.array([-20.,  0., 50., 30.])
lon_corners = np.array([ 20., 90., 90., 30.]) + 15.0 # offset from gridline for clarity

poly_corners = np.zeros((len(lat_corners), 2), np.float64)
poly_corners[:,0] = lon_corners
poly_corners[:,1] = lat_corners

poly = mpatches.Polygon(poly_corners, closed=True, ec='r', fill=True, lw=1, fc="yellow", transform=ccrs.Geodetic())
ax.add_patch(poly)

plt.show()


0 commentaires