import csv,math,json
rows=list(csv.DictReader(open('elevations200.csv')))
ev=[float(r['elev_m']) for r in rows]
print('data rows:',len(rows))
print('-9999 count:',sum(1 for v in ev if v==-9999))
g=[v for v in ev if v!=-9999]
print('min %.1f  max %.1f  mean %.2f'%(min(g),max(g),sum(g)/len(g)))
# id/lat/lon must match grid200 exactly
grid=json.load(open('grid200.json'))['cells']
assert len(grid)==len(rows)
bad=0
for c,r in zip(sorted(grid,key=lambda x:x['id']),rows):
    if c['id']!=int(r['id']) or abs(c['lat']-float(r['lat']))>1e-6 or abs(c['lon']-float(r['lon']))>1e-6: bad+=1
print('id/lat/lon mismatches vs grid200.json:',bad)

def near(lat,lon):
    best=None;bd=1e18
    for r in rows:
        dy=(float(r['lat'])-lat)*111132.0
        dx=(float(r['lon'])-lon)*111319.4908*math.cos(math.radians(lat))
        d=dx*dx+dy*dy
        if d<bd: bd=d;best=r
    return float(best['elev_m']),math.sqrt(bd)
lm=[('Twin Peaks',37.7544,-122.4477,200,285),('Ocean Beach',37.7594,-122.5107,0,15),
    ('Embarcadero',37.7955,-122.3937,0,10),('Mt Davidson',37.7382,-122.4543,230,285),
    ('Mission Dolores',37.7596,-122.4269,15,35),('Bernal Heights',37.7439,-122.4156,90,140)]
print('\nLANDMARKS (nearest cell, dist in m):')
for n,la,lo,a,b in lm:
    v,d=near(la,lo)
    print('  %-16s %7.1f m  (cell %4.0f m away)  %s'%(n,v,d,'PASS' if a<=v<=b else 'FAIL'))

# cross-check vs 400 m elevations.csv
old=list(csv.DictReader(open('elevations.csv')))
diffs=[]
for o in old:
    oe=float(o['elev_m'])
    if oe==-9999: continue
    v,d=near(float(o['lat']),float(o['lon']))
    if v==-9999 or d>30: continue
    diffs.append(abs(v-oe))
print('\n400m cross-check: %d cells compared, mean |diff| = %.2f m, max %.1f m'%(len(diffs),sum(diffs)/len(diffs),max(diffs)))
