2016-10-12 1 views
0

Ich handle Iriswürfel mit meteorologischen Daten (Lon, Lat, Niederschlag, Temperatur, ...) und ich bin interessiert an Statistiken in definierten Bereichen (zum Beispiel ein Land) zu berechnen.Clip eine definierte Region in IRIS Cube mit einem Shapefile

Diese post erklärt, wie man den Würfel mit einer Box beschneidet (min lon, min lat, max lon, max lat), aber ich würde gerne einen Schritt weiter gehen und einen genauen Bereich mit einem Shapefile auswählen.

Diese post erklärt, dass es möglich ist, ein Bild mit einem Shapefile zuzuschneiden, das mit einer Maske verbunden ist, aber ich weiß nicht, wie ich es für meine Iriswürfel funktionieren lassen kann.

Wenn mir jemand ein Beispiel geben oder mir erklären könnte, wie das geht, wäre das sehr nützlich.

PS: Ich bin ganz noobie mit Python

Antwort

1

zum Beispiel mit der Shape-Datei gelesen hat Fiona so etwas wie dies funktionieren soll:

from shapely.geometry import MultiPoint 

# Create a mask for the data 
mask = np.ones(cube.shape, dtype=bool) 

# Create a set of x,y points from the cube 
x, y = np.meshgrid(cube.coord(axis='X').points, cube.coord(axis='Y').points) 
lat_lon_points = np.vstack([x.flat, y.flat]) 
points = MultiPoint(lat_lon_points.T) 

# Find all points within the region of interest (a Shapely geometry) 
indices = [i for i, p in enumerate(points) if region.contains(p)] 

mask[np.unravel_index(indices)] = False 

# Then apply the mask 
if isinstance(cube.data, np.ma.MaskedArray): 
    cube.data.mask &= mask 
else: 
    cube.data = np.ma.masked_array(cube.data, mask) 

Dies funktioniert nur für 2D-Würfel, aber für höhere Dimensionen braucht nur zwicken, so dass der Maske nur über die lat/lon Dimensionen ist.

Ich habe dieses Verhalten in CIS vor kurzem implementiert, so dass Sie cube.subset(shape=region) tun können, die für Sie einfacher sein könnte.

Verwandte Themen