es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Archivo de forma de Cartopy resultando en un punto.

Estoy tratando de cambiar de basemap a cartopy y estoy experimentando algunas dificultades para trazar un shapefile simple.

Usando basemap puedo obtener esto:

Código:

from mpl_toolkits.basemap import Basemap

define map extent

lllat=1.1497
urlat=1.5133
lllon=103.5822
urlon=104.1579

Set up Basemap instance

m = Basemap(
    projection = 'merc',
    llcrnrlon = lllon, llcrnrlat = lllat, urcrnrlon = urlon, urcrnrlat = urlat,
    resolution='h')

shp_info = m.readshapefile('singapore_shapefile',
                            'singapore',
                            drawbounds=True)

Sin embargo, con cartopy, obtengo una imagen en blanco con un punto en el centro.

import cartopy.crs as ccrs
import cartopy.io.shapereader as shpreader
from cartopy.feature import ShapelyFeature

define map extent

lllat=1.1497
urlat=1.5133
lllon=103.5822
urlon=104.1579

Set up cartopy instance

m = ccrs.Mercator()
ax = plt.axes(projection=m)
plt.gcf().set_size_inches(20, 10)

reader = shpreader.Reader("singapore_shapefile")
shape_feature = ShapelyFeature(reader.geometries(), m, facecolor="w", 
                               edgecolor='black', lw=1)
ax.add_feature(shape_feature)

plt.savefig("test.png")

¿Alguien puede señalarme en la dirección correcta?

Shapefile: https://drive.google.com/file/d/1suB-VD65bmwesJo01mAvVUolRReWUkdV/view?usp=sharing

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema puede estar en la forma en que estamos creando la instancia de mapa con cartopy.

    En lugar de usar ccrs.Mercator(), podemos usar ccrs.PlateCarree(), que es una proyección geográfica comúnmente utilizada para mapas del mundo.

    Además, para asegurarnos de que la extensión del mapa sea la misma que la versión del mapa base, necesitamos establecer el método ax.set_extent().

    Aquí hay un fragmento de código actualizado que debería funcionar:

    import cartopy.crs as ccrs
    import cartopy.io.shapereader as shpreader
    from cartopy.feature import ShapelyFeature
    import matplotlib.pyplot as plt
    
    # define map extent
    lllat=1.1497
    urlat=1.5133
    lllon=103.5822
    urlon=104.1579
    
    # Set up cartopy instance
    m = ccrs.PlateCarree()
    ax = plt.axes(projection=m)
    ax.set_extent([lllon, urlon, lllat, urlat], crs=m)
    plt.gcf().set_size_inches(20, 10)
    
    reader = shpreader.Reader("singapore_shapefile")
    shape_feature = ShapelyFeature(reader.geometries(), m, facecolor="w", 
                                   edgecolor='black', lw=1)
    ax.add_feature(shape_feature)
    
    plt.savefig("test.png")
    

    Esto debería darte una salida de mapa similar a la versión del mapa base. ¡Avísame si esto ayuda!

Comments are closed.