Ellipses#

[1]:
import starepandas
import pystare
import matplotlib.pyplot as plt
import geopandas
import copy
import numpy
import pandas
[2]:
mod03_name = '../tests/data/granules/MOD03.A2017345.1925.006.2017346004924.hdf'
mod03 = starepandas.read_granule(mod03_name, sidecar_path='../tests/data/granules/MOD03.A2017345.1925.006.2017347015352_stare.nc', sidecar=True, xy=True)
[3]:
mod03 = copy.copy(mod03[0:4])
[4]:
lat, lon = pystare.to_latlon(mod03.sids)
lon = lon - 360
geoms = geopandas.points_from_xy(x=lon,y=lat, crs=4326)
mod03.set_geometry(geoms, inplace=True)

Make ellipses#

[5]:
ellipse_sids = starepandas.io.granules.modis.make_ellipse_sids(mod03, n_partitions=1, num_workers=1, level=17, crs=3857, modis_resolution=1000)
mod03['ellipse_sids'] = ellipse_sids
[6]:
ellipse_trixels = mod03.make_trixels(sid_column='ellipse_sids', n_partitions=1, num_workers=1)
mod03['ellipse_trixels'] = ellipse_trixels

Make circles#

[7]:
r_circle = 500
r_earth = 6378137
phi = r_circle /2/3.14/r_earth*360
phi
[7]:
0.004493854613371522
[8]:
circle_sids = starepandas.make_circular_sids(mod03, level=17, diameter=phi, n_partitions=1, num_workers=1)
mod03['circle_sids'] = circle_sids
[9]:
cirlce_trixels = mod03.make_trixels(sid_column='circle_sids', n_partitions=1, num_workers=1)
mod03['circle_trixels'] = cirlce_trixels

Plot#

[10]:
fig, ax = plt.subplots(figsize=(8,1.5), dpi=200)

mod03.set_trixels('ellipse_trixels').plot(ax=ax, trixels=True, boundary=True, column='x', legend=True, linewidth=0.1, zorder=2)
mod03.set_trixels('circle_trixels').plot(ax=ax, trixels=True, boundary=True,  linewidth=0.1, zorder=2, color='red')
mod03.plot(ax=ax, trixels=False, markersize=0.1, marker='.', zorder=1)
../../_images/examples_notebooks_ellipses_13_0.png

Fit Ellipse#

[11]:
deg = [0.,10,20,30,40,50,55]
scan_pts = [1, 1.05, 1.2, 1.5, 2, 3.2, 4.83]
trac_pts = [1, 1.028, 1.083, 1.193, 1.367, 1.688, 2.01]
[12]:
def func(x, a, b, c):
    return numpy.exp(a*x)/b+c
[13]:
from scipy.optimize import curve_fit
scan_params, cov = curve_fit(func, deg, scan_pts, bounds=(0, [1, 100, 1]))
trac_params, cov = curve_fit(func, deg, trac_pts, bounds=(0, [1, 100, 1]))
[14]:
fig, ax = plt.subplots(figsize=(16,9), dpi=100)

df = pandas.DataFrame({'deg': deg, 'scan_pts': scan_pts, 'trac_pts': trac_pts})
df['Along scan iFOV size'] = numpy.exp(scan_params[0]*df['deg'])/scan_params[1]+scan_params[2]
df['Along track iFOV size'] = numpy.exp(trac_params[0]*df['deg'])/trac_params[1]+trac_params[2]

df.plot(ax=ax, x='deg', y=['scan_pts', 'trac_pts'], grid=True, ylabel='Distance', xlabel='Scan Angle', marker='x', linewidth=0)
df.plot(ax=ax, x='deg', y=['Along scan iFOV size', 'Along track iFOV size'], grid=True, ylabel='Distance', xlabel='Scan Angle')
[14]:
<AxesSubplot:xlabel='Scan Angle', ylabel='Distance'>
../../_images/examples_notebooks_ellipses_18_1.png