1
votes

Comment vérifier si une paire de coordonnées (lat, lon) existe dans une grille de coordonnées?

J'ai un algorithme qui calcule les formes en utilisant des coordonnées géographiques lorsque certaines conditions sont remplies. L'algorithme génère une liste de latitude et une liste de longitude comme illustré ci-dessous. Ainsi, lat [0] et lon [0] représenteraient une paire de coordonnées. Je veux créer un tableau booléen sous la forme d'une carte de latitude et de longitude où les indices seraient vrais si un point de coordonnées correspondant existe dans la sortie de l'algorithme. J'ai les informations de latitude et de longitude d'origine du fichier netcdf, mais comment créer un tableau 2d de points de coordonnées pouvant être comparés à la sortie de l'algorithme, puis utiliser les indices correspondants pour créer ce tableau booléen?

I ' J'ai essayé de combiner la latitude et la longitude en un seul tableau. len (lat) = 81, len (lon) = 480 et j'ai besoin d'un tableau de (81480) . Je suppose que je devrais utiliser une fonction numpy where pour déterminer où les paires de coordonnées correspondent.

lat_alg = [-47.25 -47.25 -47.25 -48.   -48.   -48.   -48.   -48.   -48.   -48.
 -48.   -48.75 -48.75 -48.75 -48.75 -48.75 -48.75 -49.5  -49.5  -49.5
 -49.5  -50.25 -50.25 -50.25]
lon_alg = [225.75 226.5  227.25 226.5  227.25 228.   228.75 229.5  230.25 231.
 231.75 228.   228.75 229.5  230.25 231.   231.75 229.5  230.25 231.
 231.75 230.25 231.   231.75]

Le tableau booléen que je crée est ... ar_tracker = np.zeros ((len (lat), len (lon)))

et je veux que la sortie soit 1 là où les coordonnées correspondent.


1 commentaires

Veuillez indiquer si l'une des réponses vous convient! Si l'une d'entre elles est la réponse acceptée pour vous, vous pouvez cliquer sur la case à cocher «accepté» (qui est juste en dessous des signes de vote haut / bas et devient verte lorsque vous cliquez dessus). Donc tout le monde sait qu'il n'y a plus besoin de réponses et que cette tâche est close.


3 Réponses :


0
votes

Puisque vous avez des valeurs réelles, vous ne pouvez pas vérifier avec == . Il faut donc utiliser des fenêtres confinées par des inégalités. En conséquence, nous obtenons les indices des éléments dans la fenêtre choisie ( 11 et 12 dans cet exemple )

(np.abs(Lo*La)>0.0001).astype(int)
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0])

Ou si vous préférez un tableau avec des booléens:

# 1. build numpy arrays
lat = np.array([-47.25, -47.25, -47.25, -48.,   -48.,   -48.,   -48.,   -48.,   -48.,   -48., -48.,   -48.75, -48.75, -48.75, -48.75, -48.75, -48.75, -49.5,  -49.5,  -49.5, -49.5,  -50.25, -50.25, -50.25])
lon= np.array([225.75, 226.5,  227.25, 226.5,  227.25, 228.,   228.75, 229.5,  230.25, 231., 231.75, 228.,   228.75, 229.5,  230.25, 231.,   231.75, 229.5,  230.25, 231., 231.75, 230.25, 231., 231.75])


# 2. pick the values in the desired window for each data series, set to zeros the others
La = np.where( (lat> -49.0) & (lat<-48), lat, 0*lat)
Lo = np.where( (lon>226) & (lon<229), lon, 0*lon)

#3. give the indices where both series are non-zero
ind = np.argwhere(np.abs(Lo*La)>0.0001)
ind
array([[11],
       [12]], dtype=int64)


0 commentaires

0
votes

Essayez ceci:

import numpy as np

lat_alg = np.array([-47.25, -47.25, -47.25, -48., -48., -48., -48., -48., -48.,
                    -48., -48., -48.75, -48.75, -48.75, -48.75, -48.75, -48.75,
                    -49.5, -49.5, -49.5, -49.5, -50.25, -50.25, -50.25])
lon_alg = np.array([225.75, 226.5, 227.25, 226.5, 227.25, 228., 228.75, 229.5,
                    230.25, 231., 231.75, 228., 228.75, 229.5, 230.25, 231.,
                    231.75, 229.5, 230.25, 231., 231.75, 230.25, 231., 231.75])

desired_position = np.array([-47.5, 228])

lat = np.isclose(lat_alg - desired_position[0], 0)
lon = np.isclose(lon_alg - desired_position[1], 0)

exact_matches = np.outer(lat, lon).astype(int)

Si vous souhaitez comparer des correspondances exactes au lieu de coordonnées fenêtres , essayez d'utiliser numpy.isclose pour éviter les écarts de virgule flottante:

import numpy as np

lat_alg = np.array([-47.25, -47.25, -47.25, -48., -48., -48., -48., -48., -48.,
                    -48., -48., -48.75, -48.75, -48.75, -48.75, -48.75, -48.75,
                    -49.5, -49.5, -49.5, -49.5, -50.25, -50.25, -50.25])
lon_alg = np.array([225.75, 226.5, 227.25, 226.5, 227.25, 228., 228.75, 229.5,
                    230.25, 231., 231.75, 228., 228.75, 229.5, 230.25, 231.,
                    231.75, 229.5, 230.25, 231., 231.75, 230.25, 231., 231.75])

desired_position = np.array([-47.5, 228])
tolerance = 1

lat = np.abs(lat_alg - desired_position[0]) <= tolerance
lon = np.abs(lon_alg - desired_position[1]) <= tolerance 

desired_area = np.outer(lat, lon).astype(int)

Les deux zone_désirée et correspondances_exactes sont des tableaux 2D de forme (len (lat), len (lon)) code>.


0 commentaires

0
votes

Afin d'être totalement sûr de l'existence de la paire, je vous suggère de construire une liste de tuples où chaque tuple contient une paire (lat, lon). Par exemple:

coord=(-49.5,230.25)

if coord in Coord:
    print('True')
else:
    print('False')

Ensuite, si vous connaissez la résolution de votre grille, vous pouvez facilement vérifier une paire comme suit:

def Mesh(X,Y):
    A=[]
    for x,y in zip(X,Y):
        A.append((x,y))

    return A

Coord=Mesh(lat_alg,lon_alg)


0 commentaires