SpatioTemporal / STAREPandas

STAREpandas adds SpatioTemporal Adaptive Resolution Encoding (STARE) support to pandas DataFrames. https://starepandas.readthedocs.io/en/latest/
MIT License
4 stars 1 forks source link

make_sids() should allow to specify the level for each row #129

Open NiklasPhabian opened 1 year ago

NiklasPhabian commented 1 year ago

It may be of interest to set the level for each row of a dataframe individually

NiklasPhabian commented 1 year ago

rings = df.to_crs(5070).exterior
avg_len = []
for geom in rings:
    avg_len.append(geom.length/len(geom.xy[0]))
df['avg_len'] = avg_len

def level(length):
    if length < 625:
        return 14
    elif length < 1250:
        return 13
    elif length < 2500:
        return 12
    elif length < 5000:
        return 11
    elif length < 10000:
        return 10
    elif length < 20000:
        return 9
    elif length < 40000:        
        return 8
    else: 
        return 7
df['level'] = df.avg_len.map(level)

def make_sids(row):  
    ring = row.geometry.exterior
    level = row.level
    if not ring.is_ccw:
        ring = shapely.geometry.LinearRing(ring.coords[::-1])
    latlon = ring.coords.xy
    lon = latlon[0]
    lat = latlon[1]    
    range_indices = pystare.cover_from_ring(lat, lon, level)
    return range_indices

ddf = dask.dataframe.from_pandas(df, npartitions=600)
meta = {'name': 'int64'}
res = ddf.apply(make_sids, meta=meta, axis=1)
sids = res.compute(scheduler='processes', num_workers=60)
sids.name = 'sids'