Skip to content

Commit 977236f

Browse files
committed
Add method to get contour which contains x,y observations
1 parent 8499085 commit 977236f

File tree

2 files changed

+42
-1
lines changed

2 files changed

+42
-1
lines changed

CHANGELOG.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ Added
2121
- Add **EddyQuickCompare** to have few figures about several datasets in comparison based on match function
2222
- Color field for contour in **EddyAnim** could be choose
2323
- Save EddyAnim in mp4
24+
- Add method to get eddy contour which enclosed obs defined with (x,y) coordinates
2425

2526
[3.3.0] - 2020-12-03
2627
--------------------

src/py_eddy_tracker/observations/observation.py

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -363,7 +363,7 @@ def add_fields(self, fields=list(), array_fields=list()):
363363

364364
def add_rotation_type(self):
365365
new = self.add_fields(("type_cyc",))
366-
new.type_cyc = self.sign_type
366+
new.type_cyc[:] = self.sign_type
367367
return new
368368

369369
def circle_contour(self, only_virtual=False):
@@ -1905,6 +1905,19 @@ def is_convex(self, intern=False):
19051905
xname, yname = self.intern(intern)
19061906
return convexs(self[xname], self[yname])
19071907

1908+
def contains(self, x, y, intern=False):
1909+
"""
1910+
Return index of contour which contain (x,y)
1911+
1912+
:param array x: longitude
1913+
:param array y: latitude
1914+
:param bool intern: If true use speed contour instead of effective contour
1915+
:return: indexs, -1 if no index
1916+
:rtype: array[int32]
1917+
"""
1918+
xname, yname = self.intern(intern)
1919+
return poly_indexs(x, y, self[xname], self[yname])
1920+
19081921
def inside(self, x, y, intern=False):
19091922
"""
19101923
True for each point inside the effective contour of an eddy
@@ -2181,6 +2194,33 @@ def grid_count_pixel_in(
21812194
grid_count_(grid, i, j)
21822195

21832196

2197+
@njit(cache=True)
2198+
def poly_indexs(x_p, y_p, x_c, y_c):
2199+
"""
2200+
index of contour for each postion inside a contour, -1 in case of no contour
2201+
2202+
:param array x_p: longitude to test
2203+
:param array y_p: latitude to test
2204+
:param array x_c: longitude of contours
2205+
:param array y_c: latitude of contours
2206+
"""
2207+
nb_p = x_p.shape[0]
2208+
nb_c = x_c.shape[0]
2209+
indexs = -ones(nb_p, dtype=numba_types.int32)
2210+
for i in range(nb_c):
2211+
x_c_min, y_c_min = x_c[i].min(), y_c[i].min()
2212+
x_c_max, y_c_max = x_c[i].max(), y_c[i].max()
2213+
v = create_vertice(x_c[i], y_c[i])
2214+
for j in range(nb_p):
2215+
if indexs[j] != -1:
2216+
continue
2217+
x, y = x_p[j], y_p[j]
2218+
if x > x_c_min and x < x_c_max and y > y_c_min and y < y_c_max:
2219+
if winding_number_poly(x, y, v) != 0:
2220+
indexs[j] = i
2221+
return indexs
2222+
2223+
21842224
@njit(cache=True)
21852225
def insidepoly(x_p, y_p, x_c, y_c):
21862226
"""

0 commit comments

Comments
 (0)