import json,glob,bisect,math,os
R=20037508.34/180.0
g=json.load(open('grid200.json')); cells=g['cells']
spec=json.load(open('row_spec200.json')); dx=spec['dx']
rowlat={r['row']:r['lat'] for r in spec['rows']}
# per-row sampled longitudes
samp={}
for f in glob.glob('erow_*.txt'):
    row=int(os.path.basename(f)[5:7])
    d=[]
    for ln in open(f):
        ln=ln.strip()
        if not ln: continue
        lo,v=ln.split(','); d.append((float(lo),float(v)))
    d.sort(); samp[row]=d
# extra recovered points
extra={}
if os.path.exists('erecover.txt'):
    for ln in open('erecover.txt'):
        ln=ln.strip()
        if not ln: continue
        cid,v=ln.split(','); extra[int(cid)]=float(v)
TOL=30.0
out=[]; miss=[]
for c in cells:
    row=c['row']
    if c['id'] in extra:
        out.append((c['id'],c['lat'],c['lon'],extra[c['id']])); continue
    d=samp.get(row,[])
    lons=[x[0] for x in d]
    best=None;bd=1e9
    j=bisect.bisect_left(lons,c['lon'])
    for jj in (j-1,j,j+1):
        if 0<=jj<len(d):
            dist=abs(d[jj][0]-c['lon'])*111319.4908*math.cos(math.radians(c['lat']))
            if dist<bd: bd=dist; best=d[jj][1]
    if best is not None and bd<=TOL:
        out.append((c['id'],c['lat'],c['lon'],best))
    else:
        out.append((c['id'],c['lat'],c['lon'],-9999)); miss.append(c)
out.sort()
with open('elevations200.csv','w') as f:
    f.write('id,lat,lon,elev_m\n')
    for i,la,lo,e in out:
        f.write('%d,%.6f,%.6f,%s\n'%(i,la,lo,'-9999' if e==-9999 else '%.1f'%e))
json.dump(miss,open('missing200.json','w'))
print('rows written',len(out),'unmatched',len(miss))
