def getFilteredNeighbors(station,topoThresh=TOPO_THRESHOLD,elevThresh=ELEV_THRESHOLD): # Get nearby stations # t0neighborQuery = datetime.now() neighborQuery = stations.find({ "_id":{"$ne":station['_id']}, "loc":{"$near":{"$geometry":station['loc'], "$maxDistance":DISTANCE_THRESHOLD} } }, { "loc":1 })#.limit(5) t0NeighborLoop = datetime.now() # dt = datetime.now() - t0neighborQuery # print("Neighbor query: %.6fs"%dt.total_seconds()) neighbors = [] filteredNeighbors=[] if neighborQuery.count()==np.nan: print "Station %s has no nearby stations."%station['_id'] else: # print "%s's %i nearby stations:"%(station['_id'],neighborQuery.count()) c0 = station['loc']['coordinates'] stationLoc = LatLon(c0[1],c0[0]) neighborCount = 0 for neighbor in neighborQuery: neighbors.append(neighbor) neighborCount+=1 c1 = neighbor['loc']['coordinates'] neighborLoc = LatLon(c1[1],c1[0]) # t0topoQuery = datetime.now() elevProfile = np.array(getElevationProfile(stationLoc.lon.decimal_degree, stationLoc.lat.decimal_degree, neighborLoc.lon.decimal_degree, neighborLoc.lat.decimal_degree)) elevs=elevProfile[:,2] #print (elevProfile) relativePeakHeight = elevs.max() \ - np.max([elevs[0],elevs[-1]]) neighbor['distance'] = stationLoc.distance(neighborLoc) # print(neighbor['_id'], elevs.max(),relativePeakHeight,dist) elevDiff = abs(elevs[0]-elevs[-1]) if relativePeakHeight<topoThresh and elevDiff < elevThresh: filteredNeighbors.append(neighbor) #print("StationLoop: %i stations, %.6fs"%(neighborCount,(datetime.now()-t0NeighborLoop).total_seconds())) return filteredNeighbors, neighbors
def do_GET(s): """Respond to a GET request.""" req = urlparse(s.path) if req.path.startswith('/index.html'): s.send_response(200) s.send_header("Content-type", "text/html") s.end_headers() s.wfile.write(open('public/index.html').read()) elif req.path.startswith('/elevationProfile'): query = parse_qs(req.query) try: elevProfile = getElevationProfile( float(query['lon0'][0]), float(query['lat0'][0]), float(query['lon1'][0]), float(query['lat1'][0])) except: s.send_response(500) return max = -9999 min = 9000000 for x,y,z in elevProfile: if z > max: max = z if z > -999 and z < min: min = z elevProfile = [{"lon":x,"lat":y,"elev":float(z)} for x,y,z in elevProfile] resp = { "maxElevation": float(max), "minElevation": float(min), "units": 'meters', "points": elevProfile } s.send_response(200) s.send_header("Content-type", "application/json") s.end_headers() s.wfile.write(json.dumps(resp)) elif req.path.startswith('/getElevation'): query = parse_qs(req.query) try: lon,lat=(query['lon'][0],query['lat'][0]) elev = getElevation(lon,lat) except: s.send_response(500) return resp = { "elev": float(elev), "lat": float(lat), "lon": float(lon), "units": 'meters' } s.send_response(200) s.send_header("Content-type", "application/json") s.end_headers() s.wfile.write(json.dumps(resp)) elif req.path.startswith('/getFilteredNeighbors'): query = parse_qs(req.query) try: stationId = query['stationId'][0] topoThresh = query['topoThresh'] if len(topoThresh)>0: topoThresh = float(topoThresh[0])/FEET_PER_METER elevThresh = query['elevThresh'] if len(elevThresh)>0: elevThresh = float(elevThresh[0])/FEET_PER_METER station = stations.find_one({ "_id":stationId },{ "loc":1 }) except: s.send_response(500) return if station: filteredNeighbors, neighbors = getFilteredNeighbors(station,topoThresh=topoThresh,elevThresh=elevThresh) resp={"station":station, "filteredNeighbors":filteredNeighbors, "neighbors":neighbors } else: resp={} s.send_response(200) s.send_header("Content-type", "application/json") s.end_headers() s.wfile.write(json.dumps(resp)) else: s.send_response(500)
import argparse, json from GTOPO30 import getElevationProfile from LatLon import LatLon parser = argparse.ArgumentParser(description='Get elevation profile for a line between two points.') parser.add_argument('--lat0', dest='lat0', action='store', type=float, default = -999) parser.add_argument('--lon0', dest='lon0', action='store', type=float, default = -999) parser.add_argument('--lat1', dest='lat1', action='store', type=float, default = -999) parser.add_argument('--lon1', dest='lon1', action='store', type=float, default = -999) args=parser.parse_args() p0 = LatLon(args.lat0,args.lon0) p1 = LatLon(args.lat1,args.lon1) elevProfile = getElevationProfile(float(args.lon0),float(args.lat0),float(args.lon1),float(args.lat1)) elevProfile = [{"lon":x,"lat":y,"elev":float(z)} for x,y,z in elevProfile] print json.dumps(elevProfile)