diff --git a/RFCP-Phase-2.5.1-Performance-AppClose.md b/RFCP-Phase-2.5.1-Performance-AppClose.md new file mode 100644 index 0000000..1c9ddac --- /dev/null +++ b/RFCP-Phase-2.5.1-Performance-AppClose.md @@ -0,0 +1,577 @@ +# RFCP Phase 2.5.1: Performance Tuning + App Close Fix + +**Date:** February 1, 2025 +**Type:** Performance + Bug Fix +**Priority:** HIGH +**Depends on:** Phase 2.5.0 + +--- + +## 🎯 Summary + +Phase 2.5.0 vectorization ΠΏΡ€Π°Ρ†ΡŽΡ”, Π°Π»Π΅ bottleneck залишився: +- `line_intersects_polygons_batch()` ΠΌΠ°Ρ” Π²Π½ΡƒΡ‚Ρ€Ρ–ΡˆΠ½Ρ–ΠΉ loop ΠΏΠΎ polygons +- 351-458 walls ΠΏΠ΅Ρ€Π΅Π²Ρ–Ρ€ΡΡŽΡ‚ΡŒΡΡ для ΠΊΠΎΠΆΠ½ΠΎΡ— Ρ‚ΠΎΡ‡ΠΊΠΈ +- Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚: 329ms/point (ΠΌΠ°ΠΉΠΆΠ΅ Π±Π΅Π· Π·ΠΌΡ–Π½) + +Π’Π°ΠΊΠΎΠΆ: App close Π”ΠžΠ‘Π† Π½Π΅ ΠΏΡ€Π°Ρ†ΡŽΡ” β€” хрСстик Π½Π΅ Π·Π°ΠΊΡ€ΠΈΠ²Π°Ρ” backend. + +--- + +## πŸ“Š Current Performance Analysis + +``` +[DOMINANT_PATH_VEC] Point #1: buildings=50, walls=351 +[DOMINANT_PATH_VEC] Point #2: buildings=50, walls=439 +[DOMINANT_PATH_VEC] Point #3: buildings=50, walls=458 + +Result: 329ms/point β€” NOT improved! +``` + +**Root cause:** LOS check loop inside vectorized function: +```python +# geometry_vectorized.py line ~85 +for i, length in enumerate(polygon_lengths): # ← THIS LOOP + # Check each polygon... +``` + +--- + +## πŸ”§ Fix 2.5.1a: Limit Walls for Reflection Check + +**File:** `backend/app/services/geometry_vectorized.py` + +**In `find_best_reflection_path_vectorized()`:** + +```python +def find_best_reflection_path_vectorized( + tx: np.ndarray, + rx: np.ndarray, + building_walls_start: np.ndarray, + building_walls_end: np.ndarray, + wall_to_building: np.ndarray, + obstacle_polygons_x: np.ndarray, + obstacle_polygons_y: np.ndarray, + obstacle_lengths: np.ndarray, + max_candidates: int = 50, + max_walls: int = 100, # ← ADD THIS + max_los_checks: int = 10 # ← ADD THIS +) -> Tuple[Optional[np.ndarray], float, float]: + """ + Find best single-reflection path using vectorized operations. + + OPTIMIZATION: Limit walls and LOS checks for speed. + - max_walls: Only consider closest N walls for reflection + - max_los_checks: Only verify LOS for top N shortest paths + """ + num_walls = len(building_walls_start) + + if num_walls == 0: + return None, np.inf, 0.0 + + # === OPTIMIZATION 1: Limit walls by distance to path midpoint === + if num_walls > max_walls: + # Calculate midpoint of TX-RX path + midpoint = (tx + rx) / 2 + + # Calculate wall midpoints + wall_midpoints = (building_walls_start + building_walls_end) / 2 + + # Distance from each wall to path midpoint + wall_distances = np.linalg.norm(wall_midpoints - midpoint, axis=1) + + # Take closest walls + closest_indices = np.argpartition(wall_distances, max_walls)[:max_walls] + + building_walls_start = building_walls_start[closest_indices] + building_walls_end = building_walls_end[closest_indices] + wall_to_building = wall_to_building[closest_indices] + + # Log reduction (first 3 points only) + # print(f"[WALLS] Reduced {num_walls} β†’ {max_walls} walls") + + # Step 1: Calculate all reflection points at once + refl_points, valid = calculate_reflection_points_batch( + tx, rx, building_walls_start, building_walls_end + ) + + if not np.any(valid): + return None, np.inf, 0.0 + + # Step 2: Calculate path lengths for valid reflections + valid_indices = np.where(valid)[0] + valid_refl = refl_points[valid] + + tx_to_refl = np.linalg.norm(valid_refl - tx, axis=1) + refl_to_rx = np.linalg.norm(rx - valid_refl, axis=1) + path_lengths = tx_to_refl + refl_to_rx + + # === OPTIMIZATION 2: Sort by path length, check LOS only for top N === + # Sort indices by path length (shortest first) + sorted_order = np.argsort(path_lengths) + + # Limit to max_los_checks + check_count = min(len(sorted_order), max_los_checks) + + # Step 3: Check LOS only for top candidates + best_idx = -1 + best_length = np.inf + + for i in range(check_count): + idx = sorted_order[i] + refl_pt = valid_refl[idx] + length = path_lengths[idx] + + # Skip if already longer than best found + if length >= best_length: + continue + + # Check TX β†’ reflection LOS + intersects1, _ = line_intersects_polygons_batch( + tx, refl_pt, obstacle_polygons_x, obstacle_polygons_y, obstacle_lengths + ) + + if np.any(intersects1): + continue + + # Check reflection β†’ RX LOS + intersects2, _ = line_intersects_polygons_batch( + refl_pt, rx, obstacle_polygons_x, obstacle_polygons_y, obstacle_lengths + ) + + if np.any(intersects2): + continue + + # Valid path found! + best_idx = idx + best_length = length + break # ← EARLY EXIT: First valid shortest path is best + + if best_idx < 0: + return None, np.inf, 0.0 + + best_point = valid_refl[best_idx] + + # Reflection loss calculation + direct_dist = np.linalg.norm(rx - tx) + path_ratio = best_length / max(direct_dist, 1.0) + reflection_loss = 3.0 + 7.0 * min(1.0, (path_ratio - 1.0) * 2) + + return best_point, best_length, reflection_loss +``` + +**Key optimizations:** +1. **max_walls=100**: Only consider 100 closest walls (was 351-458) +2. **max_los_checks=10**: Only verify LOS for 10 shortest paths (was 50) +3. **Early exit**: Stop when first valid path found (sorted by length) + +**Expected speedup:** 5-10x for reflection calculation + +--- + +## πŸ”§ Fix 2.5.1b: Simplify LOS Check for Obstacles + +**File:** `backend/app/services/geometry_vectorized.py` + +**Optimize `line_intersects_polygons_batch()` β€” limit polygons:** + +```python +def line_intersects_polygons_batch( + p1: np.ndarray, p2: np.ndarray, + polygons_x: np.ndarray, polygons_y: np.ndarray, + polygon_lengths: np.ndarray, + max_polygons: int = 30 # ← ADD LIMIT +) -> Tuple[np.ndarray, np.ndarray]: + """ + Check if line p1β†’p2 intersects multiple polygons. + + OPTIMIZATION: Only check nearest polygons to the line. + """ + num_polygons = len(polygon_lengths) + + if num_polygons == 0: + return np.array([], dtype=bool), np.array([]) + + # === OPTIMIZATION: Filter to nearby polygons first === + if num_polygons > max_polygons: + # Quick filter: bounding box check + line_min_x = min(p1[0], p2[0]) - 50 # 50m buffer + line_max_x = max(p1[0], p2[0]) + 50 + line_min_y = min(p1[1], p2[1]) - 50 + line_max_y = max(p1[1], p2[1]) + 50 + + # Calculate polygon centroids quickly + # This is approximate but fast + idx = 0 + nearby_mask = np.zeros(num_polygons, dtype=bool) + + for i, length in enumerate(polygon_lengths): + if length < 3: + idx += length + continue + + # Polygon centroid (approximate: first vertex) + px = polygons_x[idx] + py = polygons_y[idx] + + # Check if centroid is near the line bounding box + if (line_min_x <= px <= line_max_x and + line_min_y <= py <= line_max_y): + nearby_mask[i] = True + + idx += length + + # If still too many, take first max_polygons that are nearby + nearby_indices = np.where(nearby_mask)[0] + if len(nearby_indices) > max_polygons: + nearby_indices = nearby_indices[:max_polygons] + nearby_mask = np.zeros(num_polygons, dtype=bool) + nearby_mask[nearby_indices] = True + else: + nearby_mask = np.ones(num_polygons, dtype=bool) + + # Now check only nearby polygons + intersects = np.zeros(num_polygons, dtype=bool) + min_t = np.ones(num_polygons) * np.inf + + idx = 0 + for i, length in enumerate(polygon_lengths): + if length < 3 or not nearby_mask[i]: + idx += length + continue + + # Get polygon vertices + px = polygons_x[idx:idx + length] + py = polygons_y[idx:idx + length] + + # Create edge segments + starts = np.stack([px, py], axis=1) + ends = np.stack([np.roll(px, -1), np.roll(py, -1)], axis=1) + + # Check intersections + edge_intersects, t_vals = line_segments_intersect_batch(p1, p2, starts, ends) + + if np.any(edge_intersects): + intersects[i] = True + min_t[i] = np.min(t_vals[edge_intersects]) + + idx += length + + line_length = np.linalg.norm(p2 - p1) + min_distances = min_t * line_length + + return intersects, min_distances +``` + +--- + +## πŸ”§ Fix 2.5.1c: Update Constants in dominant_path_service.py + +**File:** `backend/app/services/dominant_path_service.py` + +```python +# At top of file, update constants: +MAX_BUILDINGS_FOR_LINE = 30 # was 50 +MAX_BUILDINGS_FOR_REFLECTION = 20 # was 30 +MAX_DISTANCE_FROM_PATH = 200 # was 300m + +# In find_dominant_paths_vectorized(), add parameters: +result = find_best_reflection_path_vectorized( + tx_local, rx_local, + walls_start, walls_end, wall_to_bldg, + poly_x, poly_y, poly_lengths, + max_candidates=30, # was 50 + max_walls=100, # NEW: limit walls + max_los_checks=10 # NEW: limit LOS checks +) +``` + +--- + +## πŸ”΄ Fix 2.5.1d: App Close β€” AGGRESSIVE FIX + +**The X button STILL doesn't close the app!** + +**File:** `desktop/main.js` + +**Problem analysis:** +- `killBackend()` is called but processes survive +- `killAllBackendProcesses()` uses `execSync` but maybe fails silently +- Electron might quit before kill completes + +**AGGRESSIVE FIX β€” Multiple kill strategies:** + +```javascript +const { execSync, spawn } = require('child_process'); +const path = require('path'); + +let backendProcess = null; +let isQuitting = false; + +// Track all spawned PIDs +let knownPids = new Set(); + +function killAllRfcpProcesses() { + console.log('[KILL] === Starting aggressive kill ==='); + + if (process.platform === 'win32') { + // Strategy 1: Kill by image name (most reliable) + try { + console.log('[KILL] Strategy 1: taskkill /F /IM'); + execSync('taskkill /F /IM rfcp-server.exe', { + stdio: 'pipe', + timeout: 5000, + windowsHide: true + }); + console.log('[KILL] Strategy 1: SUCCESS'); + } catch (e) { + console.log('[KILL] Strategy 1: No processes or already killed'); + } + + // Strategy 2: Kill by tree if we have PID + if (backendProcess && backendProcess.pid) { + try { + console.log(`[KILL] Strategy 2: taskkill /F /T /PID ${backendProcess.pid}`); + execSync(`taskkill /F /T /PID ${backendProcess.pid}`, { + stdio: 'pipe', + timeout: 5000, + windowsHide: true + }); + console.log('[KILL] Strategy 2: SUCCESS'); + } catch (e) { + console.log('[KILL] Strategy 2: PID not found'); + } + } + + // Strategy 3: PowerShell kill (backup) + try { + console.log('[KILL] Strategy 3: PowerShell Stop-Process'); + execSync('powershell -Command "Get-Process rfcp-server -ErrorAction SilentlyContinue | Stop-Process -Force"', { + stdio: 'pipe', + timeout: 5000, + windowsHide: true + }); + console.log('[KILL] Strategy 3: SUCCESS'); + } catch (e) { + console.log('[KILL] Strategy 3: PowerShell failed or no processes'); + } + + // Strategy 4: WMIC kill (legacy but works) + try { + console.log('[KILL] Strategy 4: WMIC process delete'); + execSync('wmic process where "name=\'rfcp-server.exe\'" delete', { + stdio: 'pipe', + timeout: 5000, + windowsHide: true + }); + console.log('[KILL] Strategy 4: SUCCESS'); + } catch (e) { + console.log('[KILL] Strategy 4: WMIC failed'); + } + + } else { + // Unix + try { + execSync('pkill -9 -f rfcp-server', { stdio: 'pipe', timeout: 5000 }); + } catch (e) { + // Ignore + } + } + + console.log('[KILL] === Kill sequence complete ==='); +} + +// Call backend shutdown endpoint before killing +async function gracefulShutdown() { + console.log('[SHUTDOWN] Starting graceful shutdown...'); + + // Step 1: Try graceful API shutdown + try { + const controller = new AbortController(); + const timeout = setTimeout(() => controller.abort(), 2000); + + await fetch('http://127.0.0.1:8888/api/system/shutdown', { + method: 'POST', + signal: controller.signal + }); + + clearTimeout(timeout); + console.log('[SHUTDOWN] Backend acknowledged shutdown'); + + // Wait for backend to cleanup + await new Promise(r => setTimeout(r, 1000)); + + } catch (e) { + console.log('[SHUTDOWN] Backend did not respond:', e.message); + } + + // Step 2: Force kill everything + killAllRfcpProcesses(); + + // Step 3: Wait and verify + await new Promise(r => setTimeout(r, 500)); + + console.log('[SHUTDOWN] Shutdown complete'); +} + +// === EVENT HANDLERS === + +// When window X is clicked +mainWindow.on('close', async (event) => { + console.log('[EVENT] Window close clicked'); + + if (!isQuitting) { + event.preventDefault(); // Prevent immediate close + isQuitting = true; + + await gracefulShutdown(); + + // Now actually quit + app.quit(); + } +}); + +// When all windows closed +app.on('window-all-closed', () => { + console.log('[EVENT] All windows closed'); + killAllRfcpProcesses(); // Extra safety + + if (process.platform !== 'darwin') { + app.quit(); + } +}); + +// Before quit +app.on('before-quit', async (event) => { + console.log('[EVENT] Before quit'); + + if (!isQuitting) { + event.preventDefault(); + isQuitting = true; + await gracefulShutdown(); + app.quit(); + } +}); + +// Will quit (sync only!) +app.on('will-quit', () => { + console.log('[EVENT] Will quit - final sync kill'); + killAllRfcpProcesses(); +}); + +// Process exit +process.on('exit', () => { + console.log('[EVENT] Process exit'); + killAllRfcpProcesses(); +}); + +// Handle Ctrl+C in dev mode +process.on('SIGINT', () => { + console.log('[SIGNAL] SIGINT'); + killAllRfcpProcesses(); + process.exit(0); +}); + +process.on('SIGTERM', () => { + console.log('[SIGNAL] SIGTERM'); + killAllRfcpProcesses(); + process.exit(0); +}); +``` + +**Key changes:** +1. **4 kill strategies** on Windows (taskkill, PID tree, PowerShell, WMIC) +2. **`isQuitting` flag** prevents multiple shutdown attempts +3. **`event.preventDefault()`** on close to allow async shutdown +4. **Graceful shutdown first** via API, then force kill +5. **Every event handler** calls killAllRfcpProcesses() + +--- + +## πŸ”§ Fix 2.5.1e: Update Test Scripts for Win11 + +**File:** All .bat scripts + +**Replace `wmic` with PowerShell (wmic deprecated in Win11):** + +```batch +:: OLD (wmic - deprecated): +for /f "tokens=2 delims==" %%a in ('wmic OS get FreePhysicalMemory /value') do ... + +:: NEW (PowerShell): +for /f %%a in ('powershell -Command "(Get-CimInstance Win32_OperatingSystem).FreePhysicalMemory"') do set /a FREE_RAM=%%a/1024 + +:: OLD (CPU): +for /f "tokens=2 delims==" %%a in ('wmic cpu get LoadPercentage /value') do ... + +:: NEW (PowerShell): +for /f %%a in ('powershell -Command "(Get-CimInstance Win32_Processor).LoadPercentage"') do set CPU=%%a +``` + +--- + +## πŸ“ Files to Modify + +| File | Changes | +|------|---------| +| `backend/app/services/geometry_vectorized.py` | Add max_walls, max_los_checks limits; optimize LOS check | +| `backend/app/services/dominant_path_service.py` | Update constants, pass new parameters | +| `desktop/main.js` | Aggressive multi-strategy kill; async shutdown with prevention | +| `installer/*.bat` | Replace wmic with PowerShell commands | + +--- + +## πŸ§ͺ Testing + +### Test 1: Performance +```bash +# Run Detailed preset +# Expected: < 90 seconds (was 292s) +# Expected: < 100ms/point (was 329ms) +``` + +### Test 2: App Close +```bash +# Start RFCP.exe +# Click X +# Check Task Manager β€” should be 0 rfcp-server.exe +# Check console for [KILL] logs showing all strategies +``` + +### Test 3: Accuracy Spot Check +```bash +# Run Standard preset, note coverage shape +# Run Detailed preset, compare coverage shape +# Should be similar (within visual inspection) +``` + +--- + +## βœ… Success Criteria + +- [ ] Detailed preset completes in < 90 seconds +- [ ] ms/point < 100ms (was 329ms) +- [ ] App close works on first X click +- [ ] No rfcp-server.exe in Task Manager after close +- [ ] Test scripts work on Windows 11 (no wmic errors) + +--- + +## πŸ“ˆ Expected Performance + +| Metric | Before 2.5.1 | After 2.5.1 | +|--------|--------------|-------------| +| Walls checked | 351-458 | 100 max | +| LOS checks | 50 | 10 max | +| ms/point | 329ms | ~50-80ms | +| Detailed time | 292s | ~60-90s | +| App close | ❌ broken | βœ… works | + +--- + +## πŸ”œ After 2.5.1 + +If performance is acceptable: +- Phase 2.6: Fun facts loading screen +- Phase 2.6: Export to GeoJSON/KML +- Phase 2.7: Multi-site interference visualization diff --git a/backend/app/services/coverage_service.py b/backend/app/services/coverage_service.py index d7d6ac3..753bfe3 100644 --- a/backend/app/services/coverage_service.py +++ b/backend/app/services/coverage_service.py @@ -44,7 +44,7 @@ from app.services.terrain_service import terrain_service, TerrainService from app.services.los_service import los_service from app.services.buildings_service import buildings_service, Building from app.services.materials_service import materials_service -from app.services.dominant_path_service import dominant_path_service +from app.services.dominant_path_service import dominant_path_service, find_dominant_paths_vectorized from app.services.street_canyon_service import street_canyon_service, Street from app.services.reflection_service import reflection_service from app.services.spatial_index import get_spatial_index, SpatialIndex @@ -648,22 +648,28 @@ class CoverageService: break timing["buildings"] += time.time() - t0 - # Dominant path (sync) β€” uses spatial index for O(1) building lookups + # Dominant path (vectorized NumPy) β€” replaces loop-based sync version if settings.use_dominant_path and (spatial_idx or nearby_buildings): t0 = time.time() - paths = dominant_path_service.find_dominant_paths_sync( + dominant = find_dominant_paths_vectorized( site.lat, site.lon, site.height, lat, lon, 1.5, site.frequency, nearby_buildings, - spatial_idx=spatial_idx + spatial_idx=spatial_idx, ) - if paths: - best_path = paths[0] - if best_path.is_valid and best_path.path_loss < (path_loss + terrain_loss + building_loss): - path_loss = best_path.path_loss - terrain_loss = 0 - building_loss = 0 - has_los = best_path.path_type == "direct" and not best_path.materials_crossed + if dominant['path_type'] == 'direct': + # Direct LOS confirmed by vectorized check + has_los = True + building_loss = 0.0 + elif dominant['path_type'] == 'reflection': + # Reflection path bypasses buildings β€” reduce building loss + building_loss = max(0.0, building_loss - (10.0 - dominant['total_loss'])) + has_los = False + elif dominant['path_type'] == 'diffraction': + # Diffraction: use estimated loss if worse than current + if dominant['total_loss'] > building_loss: + building_loss = dominant['total_loss'] + has_los = False timing["dominant_path"] += time.time() - t0 # Street canyon (sync) diff --git a/backend/app/services/dominant_path_service.py b/backend/app/services/dominant_path_service.py index 8915545..98e1cf0 100644 --- a/backend/app/services/dominant_path_service.py +++ b/backend/app/services/dominant_path_service.py @@ -1,10 +1,15 @@ import time import numpy as np -from typing import List, Tuple, Optional, TYPE_CHECKING +from typing import List, Tuple, Optional, Dict, Any, TYPE_CHECKING from dataclasses import dataclass from app.services.terrain_service import terrain_service from app.services.buildings_service import buildings_service, Building from app.services.materials_service import materials_service, BuildingMaterial +from app.services.geometry_vectorized import ( + points_to_local_coords, + line_intersects_polygons_batch, + find_best_reflection_path_vectorized, +) if TYPE_CHECKING: from app.services.spatial_index import SpatialIndex @@ -21,9 +26,9 @@ class RayPath: is_valid: bool # Does this path exist? -MAX_BUILDINGS_FOR_LINE = 50 -MAX_BUILDINGS_FOR_REFLECTION = 30 -MAX_DISTANCE_FROM_PATH = 300 # meters +MAX_BUILDINGS_FOR_LINE = 30 +MAX_BUILDINGS_FOR_REFLECTION = 20 +MAX_DISTANCE_FROM_PATH = 200 # meters def _filter_buildings_by_distance(buildings, tx_point, rx_point, max_count=100, max_distance=500): @@ -60,6 +65,204 @@ def _filter_buildings_by_distance(buildings, tx_point, rx_point, max_count=100, return filtered[:max_count] +# ── Vectorized dominant path (NumPy) ── + +_vec_log_count = 0 + + +def _buildings_to_arrays(buildings: List[Building], ref_lat: float, ref_lon: float): + """Convert Building objects to numpy arrays for vectorized geometry. + + Returns: + walls_start: (W, 2) wall start points in local XY meters + walls_end: (W, 2) wall end points in local XY meters + wall_to_building: (W,) mapping wall index -> building index + poly_x: flattened polygon X coords + poly_y: flattened polygon Y coords + poly_lengths: (num_polygons,) vertices per polygon + """ + all_walls_start = [] + all_walls_end = [] + wall_to_building = [] + + all_poly_x = [] + all_poly_y = [] + poly_lengths = [] + + for i, b in enumerate(buildings): + geom = b.geometry # [[lon, lat], ...] + if not geom or len(geom) < 3: + poly_lengths.append(0) + continue + + poly_lats = np.array([p[1] for p in geom]) + poly_lons = np.array([p[0] for p in geom]) + px, py = points_to_local_coords(ref_lat, ref_lon, poly_lats, poly_lons) + + all_poly_x.extend(px) + all_poly_y.extend(py) + poly_lengths.append(len(geom)) + + # Extract wall segments + for j in range(len(geom) - 1): + all_walls_start.append([px[j], py[j]]) + all_walls_end.append([px[j + 1], py[j + 1]]) + wall_to_building.append(i) + + return ( + np.array(all_walls_start) if all_walls_start else np.zeros((0, 2)), + np.array(all_walls_end) if all_walls_end else np.zeros((0, 2)), + np.array(wall_to_building, dtype=int) if wall_to_building else np.zeros(0, dtype=int), + np.array(all_poly_x) if all_poly_x else np.zeros(0), + np.array(all_poly_y) if all_poly_y else np.zeros(0), + np.array(poly_lengths, dtype=int), + ) + + +def find_dominant_paths_vectorized( + tx_lat: float, tx_lon: float, tx_height: float, + rx_lat: float, rx_lon: float, rx_height: float, + frequency_mhz: float, + buildings: List[Building], + spatial_idx: 'Optional[SpatialIndex]' = None, +) -> Dict[str, Any]: + """Vectorized dominant path finding using NumPy batch operations. + + Replaces the loop-based find_dominant_paths_sync() with: + 1. Batch building-to-array conversion + 2. Vectorized LOS polygon intersection check + 3. Vectorized reflection point calculation + 4. Simplified diffraction estimate + + Returns dict with: + has_los, path_type, total_loss, path_length, reflection_point + """ + global _vec_log_count + + # Get nearby buildings via spatial index (same filtering as sync version) + if spatial_idx: + line_buildings = spatial_idx.query_line(tx_lat, tx_lon, rx_lat, rx_lon) + else: + line_buildings = buildings + + line_buildings = _filter_buildings_by_distance( + line_buildings, + (tx_lat, tx_lon), (rx_lat, rx_lon), + max_count=MAX_BUILDINGS_FOR_LINE, + max_distance=MAX_DISTANCE_FROM_PATH, + ) + + # Reference point for local coordinate system + ref_lat = (tx_lat + rx_lat) / 2 + ref_lon = (tx_lon + rx_lon) / 2 + + # Convert TX/RX to local meters + tx_xy = points_to_local_coords(ref_lat, ref_lon, np.array([tx_lat]), np.array([tx_lon])) + rx_xy = points_to_local_coords(ref_lat, ref_lon, np.array([rx_lat]), np.array([rx_lon])) + tx = np.array([tx_xy[0][0], tx_xy[1][0]]) + rx = np.array([rx_xy[0][0], rx_xy[1][0]]) + + direct_dist = np.linalg.norm(rx - tx) + + # Convert buildings to arrays + walls_start, walls_end, wall_to_bldg, poly_x, poly_y, poly_lengths = ( + _buildings_to_arrays(line_buildings, ref_lat, ref_lon) + ) + + # Diagnostic log for first few points + _vec_log_count += 1 + if _vec_log_count <= 3: + print( + f"[DOMINANT_PATH_VEC] Point #{_vec_log_count}: " + f"buildings={len(line_buildings)}, walls={len(walls_start)}, " + f"dist={direct_dist:.0f}m", + flush=True, + ) + + # No buildings β†’ direct LOS + if len(poly_lengths) == 0 or np.all(poly_lengths < 3): + return { + 'has_los': True, + 'path_type': 'direct', + 'total_loss': 0.0, + 'path_length': direct_dist, + 'reflection_point': None, + } + + # Step 1: Vectorized direct LOS check + intersects, _ = line_intersects_polygons_batch(tx, rx, poly_x, poly_y, poly_lengths) + + if not np.any(intersects): + return { + 'has_los': True, + 'path_type': 'direct', + 'total_loss': 0.0, + 'path_length': direct_dist, + 'reflection_point': None, + } + + # Step 2: Vectorized reflection path finding + # Use all line buildings for reflection walls + if spatial_idx: + mid_lat = (tx_lat + rx_lat) / 2 + mid_lon = (tx_lon + rx_lon) / 2 + refl_buildings = spatial_idx.query_point(mid_lat, mid_lon, buffer_cells=3) + refl_buildings = _filter_buildings_by_distance( + refl_buildings, + (tx_lat, tx_lon), (rx_lat, rx_lon), + max_count=MAX_BUILDINGS_FOR_REFLECTION, + max_distance=MAX_DISTANCE_FROM_PATH, + ) + # Merge line + reflection buildings (deduplicate by id) + seen_ids = {b.id for b in line_buildings} + merged = list(line_buildings) + for b in refl_buildings: + if b.id not in seen_ids: + merged.append(b) + seen_ids.add(b.id) + r_walls_start, r_walls_end, r_wall_to_bldg, r_poly_x, r_poly_y, r_poly_lengths = ( + _buildings_to_arrays(merged, ref_lat, ref_lon) + ) + else: + r_walls_start, r_walls_end, r_wall_to_bldg = walls_start, walls_end, wall_to_bldg + r_poly_x, r_poly_y, r_poly_lengths = poly_x, poly_y, poly_lengths + + refl_point, refl_length, refl_loss = find_best_reflection_path_vectorized( + tx, rx, + r_walls_start, r_walls_end, r_wall_to_bldg, + r_poly_x, r_poly_y, r_poly_lengths, + max_candidates=30, + max_walls=100, + max_los_checks=10, + ) + + if refl_point is not None: + # Convert reflection point back to lat/lon + cos_lat = np.cos(np.radians(ref_lat)) + refl_lat = ref_lat + refl_point[1] / 110540.0 + refl_lon = ref_lon + refl_point[0] / (111320.0 * cos_lat) + + return { + 'has_los': False, + 'path_type': 'reflection', + 'total_loss': refl_loss, + 'path_length': refl_length, + 'reflection_point': (refl_lat, refl_lon), + } + + # Step 3: Diffraction fallback + num_blocking = int(np.sum(intersects)) + diffraction_loss = 10.0 + 5.0 * min(num_blocking, 5) + + return { + 'has_los': False, + 'path_type': 'diffraction', + 'total_loss': diffraction_loss, + 'path_length': direct_dist, + 'reflection_point': None, + } + + class DominantPathService: """ Find dominant propagation paths (2-3 strongest) diff --git a/backend/app/services/geometry_vectorized.py b/backend/app/services/geometry_vectorized.py new file mode 100644 index 0000000..b6676c0 --- /dev/null +++ b/backend/app/services/geometry_vectorized.py @@ -0,0 +1,309 @@ +""" +Vectorized geometry operations using NumPy. + +All functions operate on arrays, not single values. +Provides 10-50x speedup over Python loops for batch geometry checks. +""" + +import numpy as np +from typing import Tuple, Optional + +EARTH_RADIUS = 6371000 # meters + + +def haversine_batch( + lat1: float, lon1: float, + lats2: np.ndarray, lons2: np.ndarray, +) -> np.ndarray: + """Distance from one point to many points (meters).""" + lat1_rad = np.radians(lat1) + lon1_rad = np.radians(lon1) + lats2_rad = np.radians(lats2) + lons2_rad = np.radians(lons2) + + dlat = lats2_rad - lat1_rad + dlon = lons2_rad - lon1_rad + + a = np.sin(dlat / 2) ** 2 + np.cos(lat1_rad) * np.cos(lats2_rad) * np.sin(dlon / 2) ** 2 + c = 2 * np.arcsin(np.sqrt(a)) + + return EARTH_RADIUS * c + + +def points_to_local_coords( + ref_lat: float, ref_lon: float, + lats: np.ndarray, lons: np.ndarray, +) -> Tuple[np.ndarray, np.ndarray]: + """Convert lat/lon to local X/Y meters (equirectangular projection).""" + cos_lat = np.cos(np.radians(ref_lat)) + x = (lons - ref_lon) * 111320.0 * cos_lat + y = (lats - ref_lat) * 110540.0 + return x, y + + +def line_segments_intersect_batch( + p1: np.ndarray, p2: np.ndarray, + segments_start: np.ndarray, segments_end: np.ndarray, +) -> Tuple[np.ndarray, np.ndarray]: + """Check if line p1->p2 intersects with N segments. + + Args: + p1, p2: shape (2,) + segments_start, segments_end: shape (N, 2) + + Returns: + intersects: bool array (N,) + t_values: parameter along p1->p2 (N,) + """ + d = p2 - p1 + seg_d = segments_end - segments_start + + cross = d[0] * seg_d[:, 1] - d[1] * seg_d[:, 0] + + parallel_mask = np.abs(cross) < 1e-10 + cross_safe = np.where(parallel_mask, 1.0, cross) + + dp = p1 - segments_start + + t = (dp[:, 0] * seg_d[:, 1] - dp[:, 1] * seg_d[:, 0]) / cross_safe + u = (dp[:, 0] * d[1] - dp[:, 1] * d[0]) / cross_safe + + intersects = ~parallel_mask & (t >= 0) & (t <= 1) & (u >= 0) & (u <= 1) + + return intersects, t + + +def line_intersects_polygons_batch( + p1: np.ndarray, p2: np.ndarray, + polygons_x: np.ndarray, polygons_y: np.ndarray, + polygon_lengths: np.ndarray, + max_polygons: int = 30, +) -> Tuple[np.ndarray, np.ndarray]: + """Check if line p1->p2 intersects multiple polygons. + + Args: + p1, p2: shape (2,) + polygons_x, polygons_y: flattened vertex arrays + polygon_lengths: vertices per polygon (num_polygons,) + max_polygons: only check nearest N polygons (bbox pre-filter) + + Returns: + intersects: bool (num_polygons,) + min_distances: distance to first hit (num_polygons,) + """ + num_polygons = len(polygon_lengths) + + if num_polygons == 0: + return np.array([], dtype=bool), np.array([]) + + intersects = np.zeros(num_polygons, dtype=bool) + min_t = np.full(num_polygons, np.inf) + + # Pre-filter: only check polygons whose first vertex is near the line bbox + if num_polygons > max_polygons: + buf = 50.0 # 50m buffer + line_min_x = min(p1[0], p2[0]) - buf + line_max_x = max(p1[0], p2[0]) + buf + line_min_y = min(p1[1], p2[1]) - buf + line_max_y = max(p1[1], p2[1]) + buf + + nearby_mask = np.zeros(num_polygons, dtype=bool) + vi = 0 + for i, length in enumerate(polygon_lengths): + if length >= 3: + cx = polygons_x[vi] + cy = polygons_y[vi] + if line_min_x <= cx <= line_max_x and line_min_y <= cy <= line_max_y: + nearby_mask[i] = True + vi += length + + # Cap at max_polygons + nearby_indices = np.where(nearby_mask)[0] + if len(nearby_indices) > max_polygons: + nearby_mask = np.zeros(num_polygons, dtype=bool) + nearby_mask[nearby_indices[:max_polygons]] = True + else: + nearby_mask = np.ones(num_polygons, dtype=bool) + + idx = 0 + for i, length in enumerate(polygon_lengths): + if length < 3 or not nearby_mask[i]: + idx += length + continue + + px = polygons_x[idx:idx + length] + py = polygons_y[idx:idx + length] + + starts = np.stack([px, py], axis=1) + ends = np.stack([np.roll(px, -1), np.roll(py, -1)], axis=1) + + edge_intersects, t_vals = line_segments_intersect_batch(p1, p2, starts, ends) + + if np.any(edge_intersects): + intersects[i] = True + min_t[i] = np.min(t_vals[edge_intersects]) + + idx += length + + line_length = np.linalg.norm(p2 - p1) + min_distances = min_t * line_length + + return intersects, min_distances + + +def calculate_reflection_points_batch( + tx: np.ndarray, rx: np.ndarray, + wall_starts: np.ndarray, wall_ends: np.ndarray, +) -> Tuple[np.ndarray, np.ndarray]: + """Calculate reflection points on N walls via mirror-image method. + + Args: + tx, rx: shape (2,) + wall_starts, wall_ends: shape (N, 2) + + Returns: + reflection_points: (N, 2) + valid: bool (N,) + """ + wall_vec = wall_ends - wall_starts + wall_length = np.linalg.norm(wall_vec, axis=1, keepdims=True) + wall_unit = wall_vec / np.maximum(wall_length, 1e-10) + + normals = np.stack([-wall_unit[:, 1], wall_unit[:, 0]], axis=1) + + tx_to_wall = tx - wall_starts + tx_dist_to_wall = np.sum(tx_to_wall * normals, axis=1, keepdims=True) + tx_mirror = tx - 2 * tx_dist_to_wall * normals + + rx_to_mirror = tx_mirror - rx + + cross_denom = (rx_to_mirror[:, 0] * wall_vec[:, 1] - + rx_to_mirror[:, 1] * wall_vec[:, 0]) + + valid_denom = np.abs(cross_denom) > 1e-10 + cross_denom_safe = np.where(valid_denom, cross_denom, 1.0) + + rx_to_start = wall_starts - rx + t = (rx_to_start[:, 0] * rx_to_mirror[:, 1] - + rx_to_start[:, 1] * rx_to_mirror[:, 0]) / cross_denom_safe + + reflection_points = wall_starts + t[:, np.newaxis] * wall_vec + + valid = valid_denom & (t >= 0) & (t <= 1) & (tx_dist_to_wall[:, 0] > 0) + + return reflection_points, valid + + +def find_best_reflection_path_vectorized( + tx: np.ndarray, rx: np.ndarray, + building_walls_start: np.ndarray, + building_walls_end: np.ndarray, + wall_to_building: np.ndarray, + obstacle_polygons_x: np.ndarray, + obstacle_polygons_y: np.ndarray, + obstacle_lengths: np.ndarray, + max_candidates: int = 50, + max_walls: int = 100, + max_los_checks: int = 10, +) -> Tuple[Optional[np.ndarray], float, float]: + """Find best single-reflection path using vectorized ops. + + Args: + max_walls: Only consider closest N walls for reflection candidates. + max_los_checks: Only verify LOS for top N shortest reflection paths. + + Returns: + best_reflection_point: (2,) or None + best_path_length: meters + best_reflection_loss: dB + """ + num_walls = len(building_walls_start) + if num_walls == 0: + return None, np.inf, 0.0 + + # Limit walls by distance to path midpoint + if num_walls > max_walls: + midpoint = (tx + rx) / 2 + wall_midpoints = (building_walls_start + building_walls_end) / 2 + wall_distances = np.linalg.norm(wall_midpoints - midpoint, axis=1) + closest = np.argpartition(wall_distances, max_walls)[:max_walls] + building_walls_start = building_walls_start[closest] + building_walls_end = building_walls_end[closest] + wall_to_building = wall_to_building[closest] + + refl_points, valid = calculate_reflection_points_batch( + tx, rx, building_walls_start, building_walls_end, + ) + + if not np.any(valid): + return None, np.inf, 0.0 + + valid_indices = np.where(valid)[0] + valid_refl = refl_points[valid] + + tx_to_refl = np.linalg.norm(valid_refl - tx, axis=1) + refl_to_rx = np.linalg.norm(rx - valid_refl, axis=1) + path_lengths = tx_to_refl + refl_to_rx + + # Direct distance filter: skip if reflection path > 2x direct + direct_dist = np.linalg.norm(rx - tx) + within_range = path_lengths <= direct_dist * 2.0 + if not np.any(within_range): + return None, np.inf, 0.0 + + valid_indices = valid_indices[within_range] + valid_refl = valid_refl[within_range] + path_lengths = path_lengths[within_range] + + # Keep top candidates by shortest path + if len(valid_indices) > max_candidates: + top_idx = np.argpartition(path_lengths, max_candidates)[:max_candidates] + valid_indices = valid_indices[top_idx] + valid_refl = valid_refl[top_idx] + path_lengths = path_lengths[top_idx] + + # Sort by path length for early exit + sort_order = np.argsort(path_lengths) + valid_refl = valid_refl[sort_order] + path_lengths = path_lengths[sort_order] + + # Check LOS only for top N shortest candidates + check_count = min(len(valid_refl), max_los_checks) + best_idx = -1 + best_length = np.inf + + for i in range(check_count): + length = path_lengths[i] + if length >= best_length: + continue + + refl_pt = valid_refl[i] + + # TX -> reflection LOS + intersects1, _ = line_intersects_polygons_batch( + tx, refl_pt, obstacle_polygons_x, obstacle_polygons_y, obstacle_lengths, + ) + if np.any(intersects1): + continue + + # Reflection -> RX LOS + intersects2, _ = line_intersects_polygons_batch( + refl_pt, rx, obstacle_polygons_x, obstacle_polygons_y, obstacle_lengths, + ) + if np.any(intersects2): + continue + + best_idx = i + best_length = length + break # sorted by length, first valid is best + + if best_idx < 0: + return None, np.inf, 0.0 + + best_point = valid_refl[best_idx] + + # Reflection loss: 3-10 dB depending on path ratio + path_ratio = best_length / max(direct_dist, 1.0) + reflection_loss = 3.0 + 7.0 * min(1.0, (path_ratio - 1.0) * 2) + + return best_point, best_length, reflection_loss diff --git a/desktop/main.js b/desktop/main.js index 068c3e8..cd47c2a 100644 --- a/desktop/main.js +++ b/desktop/main.js @@ -269,17 +269,23 @@ function createMainWindow() { }); // Save window state on close and trigger shutdown - mainWindow.on('close', () => { + mainWindow.on('close', (event) => { log('[CLOSE] Window close event fired, isQuitting=' + isQuitting); try { const bounds = mainWindow.getBounds(); store.set('windowState', bounds); } catch (_e) {} - isQuitting = true; - // Graceful shutdown is async but we also do sync kill as safety net - gracefulShutdown().catch(() => {}); - killBackend(); - killAllBackendProcesses(); + + if (!isQuitting) { + event.preventDefault(); + isQuitting = true; + gracefulShutdown().then(() => { + app.quit(); + }).catch(() => { + killAllRfcpProcesses(); + app.quit(); + }); + } }); // Load frontend @@ -364,41 +370,86 @@ function killBackend() { } /** - * Nuclear option: kill ALL rfcp-server processes by name. - * This catches orphaned workers that PID-based kill misses. + * Aggressive kill: multiple strategies to ensure ALL rfcp-server processes die. + * Uses 4 strategies on Windows for maximum reliability. */ -function killAllBackendProcesses() { - log('[KILL] killAllBackendProcesses() β€” killing by process name...'); +function killAllRfcpProcesses() { + log('[KILL] === Starting aggressive kill ==='); if (process.platform === 'win32') { + // Strategy 1: Kill by image name (most reliable) try { - execSync('taskkill /F /IM rfcp-server.exe /T', { - stdio: 'ignore', - timeout: 5000 + log('[KILL] Strategy 1: taskkill /F /IM'); + execSync('taskkill /F /IM rfcp-server.exe', { + stdio: 'pipe', + timeout: 5000, + windowsHide: true }); - log('[KILL] taskkill /IM rfcp-server.exe completed'); + log('[KILL] Strategy 1: SUCCESS'); } catch (_e) { - // Error means no processes found β€” OK - log('[KILL] No rfcp-server.exe processes found (or already killed)'); + log('[KILL] Strategy 1: No processes or already killed'); + } + + // Strategy 2: Kill by PID tree if we have PID + if (backendPid) { + try { + log(`[KILL] Strategy 2: taskkill /F /T /PID ${backendPid}`); + execSync(`taskkill /F /T /PID ${backendPid}`, { + stdio: 'pipe', + timeout: 5000, + windowsHide: true + }); + log('[KILL] Strategy 2: SUCCESS'); + } catch (_e) { + log('[KILL] Strategy 2: PID not found'); + } + } + + // Strategy 3: PowerShell kill (backup) + try { + log('[KILL] Strategy 3: PowerShell Stop-Process'); + execSync('powershell -Command "Get-Process rfcp-server -ErrorAction SilentlyContinue | Stop-Process -Force"', { + stdio: 'pipe', + timeout: 5000, + windowsHide: true + }); + log('[KILL] Strategy 3: SUCCESS'); + } catch (_e) { + log('[KILL] Strategy 3: PowerShell failed or no processes'); + } + + // Strategy 4: PowerShell CimInstance terminate (modern replacement for wmic) + try { + log('[KILL] Strategy 4: PowerShell CimInstance Terminate'); + execSync('powershell -NoProfile -Command "Get-CimInstance Win32_Process -Filter \\"name=\'rfcp-server.exe\'\\" | Invoke-CimMethod -MethodName Terminate"', { + stdio: 'pipe', + timeout: 5000, + windowsHide: true + }); + log('[KILL] Strategy 4: SUCCESS'); + } catch (_e) { + log('[KILL] Strategy 4: No processes or failed'); } } else { + // Unix: pkill try { - execSync('pkill -9 -f rfcp-server', { - stdio: 'ignore', - timeout: 5000 - }); + execSync('pkill -9 -f rfcp-server', { stdio: 'pipe', timeout: 5000 }); log('[KILL] pkill rfcp-server completed'); } catch (_e) { log('[KILL] No rfcp-server processes found'); } } + + backendPid = null; + backendProcess = null; + log('[KILL] === Kill sequence complete ==='); } /** - * Graceful shutdown: ask backend to clean up, then force kill everything. + * Graceful shutdown: API call first, then multi-strategy force kill. */ async function gracefulShutdown() { - log('[SHUTDOWN] Requesting graceful shutdown...'); + log('[SHUTDOWN] Starting graceful shutdown...'); // Step 1: Ask backend to clean up workers and exit try { @@ -410,18 +461,18 @@ async function gracefulShutdown() { }); clearTimeout(timeout); log('[SHUTDOWN] Backend acknowledged shutdown'); + // Wait for backend to cleanup + await new Promise(r => setTimeout(r, 1000)); } catch (_e) { log('[SHUTDOWN] Backend did not respond β€” force killing'); } - // Step 2: Wait briefly for graceful exit + // Step 2: Force kill everything + killAllRfcpProcesses(); + + // Step 3: Wait and verify await new Promise(r => setTimeout(r, 500)); - - // Step 3: PID-based kill (catches the main process) - killBackend(); - - // Step 4: Name-based kill (catches orphaned workers) - killAllBackendProcesses(); + log('[SHUTDOWN] Shutdown complete'); } // ── App lifecycle ────────────────────────────────────────────────── @@ -456,8 +507,7 @@ app.whenReady().then(async () => { app.on('window-all-closed', () => { log('[CLOSE] window-all-closed fired'); isQuitting = true; - killBackend(); - killAllBackendProcesses(); + killAllRfcpProcesses(); if (process.platform !== 'darwin') { app.quit(); @@ -470,17 +520,23 @@ app.on('activate', () => { } }); -app.on('before-quit', () => { - log('[CLOSE] before-quit fired'); - isQuitting = true; - killBackend(); - killAllBackendProcesses(); +app.on('before-quit', (event) => { + log('[CLOSE] before-quit fired, isQuitting=' + isQuitting); + if (!isQuitting) { + event.preventDefault(); + isQuitting = true; + gracefulShutdown().then(() => { + app.quit(); + }).catch(() => { + killAllRfcpProcesses(); + app.quit(); + }); + } }); app.on('will-quit', () => { log('[CLOSE] will-quit fired'); - killBackend(); - killAllBackendProcesses(); + killAllRfcpProcesses(); if (backendLogStream) { try { backendLogStream.end(); } catch (_e) {} @@ -508,21 +564,19 @@ process.on('exit', () => { } // Name-based kill β€” catches orphaned workers - killAllBackendProcesses(); + killAllRfcpProcesses(); }); // Handle SIGINT/SIGTERM (Ctrl+C, system shutdown) process.on('SIGINT', () => { try { log('[SIGNAL] SIGINT received'); } catch (_e) {} - killBackend(); - killAllBackendProcesses(); + killAllRfcpProcesses(); process.exit(0); }); process.on('SIGTERM', () => { try { log('[SIGNAL] SIGTERM received'); } catch (_e) {} - killBackend(); - killAllBackendProcesses(); + killAllRfcpProcesses(); process.exit(0); }); diff --git a/files.zip b/files.zip new file mode 100644 index 0000000..145fb86 Binary files /dev/null and b/files.zip differ diff --git a/installer/coverage-result-detailed.json b/installer/coverage-result-detailed.json deleted file mode 100644 index 1ca5575..0000000 --- a/installer/coverage-result-detailed.json +++ /dev/null @@ -1 +0,0 @@ -{"detail":"Calculation timeout (5 min). Cleaned up 6 workers."} \ No newline at end of file diff --git a/installer/coverage-result-fast.json b/installer/coverage-result-fast.json deleted file mode 100644 index d8ff5fb..0000000 --- a/installer/coverage-result-fast.json +++ /dev/null @@ -1 +0,0 @@ -{"points":[{"lat":50.43648648648649,"lon":30.505851605897966,"rsrp":-105.69025009224225,"distance":1806.020829185916,"has_los":false,"terrain_loss":20.396089610453,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43648648648649,"lon":30.512925802948985,"rsrp":-92.4835624335349,"distance":1583.938078688471,"has_los":false,"terrain_loss":9.196674690877161,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43648648648649,"lon":30.520000000000003,"rsrp":-82.480768797201,"distance":1502.634143845486,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43648648648649,"lon":30.52707419705102,"rsrp":-83.28688774266047,"distance":1583.9380786887555,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43648648648649,"lon":30.53414839410204,"rsrp":-106.07882989751963,"distance":1806.0208291864158,"has_los":false,"terrain_loss":20.784669415726164,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44099099099099,"lon":30.498777408846948,"rsrp":-105.02150689040504,"distance":1806.0604997412747,"has_los":false,"terrain_loss":19.727010381525975,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44099099099099,"lon":30.505851605897966,"rsrp":-91.8791706139063,"distance":1416.7644878913654,"has_los":false,"terrain_loss":10.298593806220993,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44099099099099,"lon":30.512925802948985,"rsrp":-84.53562309703902,"distance":1120.0186877266547,"has_los":false,"terrain_loss":6.550531627274763,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44099099099099,"lon":30.520000000000003,"rsrp":-82.7788514974186,"distance":1001.756095897698,"has_los":false,"terrain_loss":6.500871904841084,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44099099099099,"lon":30.52707419705102,"rsrp":-85.91239690487743,"distance":1120.0186877270576,"has_los":false,"terrain_loss":7.927305435107649,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44099099099099,"lon":30.53414839410204,"rsrp":-89.75069344387578,"distance":1416.7644878920025,"has_los":false,"terrain_loss":8.1701166361836,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44099099099099,"lon":30.54122259115306,"rsrp":-97.27959400748654,"distance":1806.0604997420244,"has_los":false,"terrain_loss":11.985097498601137,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44549549549549,"lon":30.498777408846948,"rsrp":-102.00726034842938,"distance":1583.9833103756157,"has_los":false,"terrain_loss":18.719935756192406,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44549549549549,"lon":30.505851605897966,"rsrp":-88.6845207032794,"distance":1120.0400111348658,"has_los":false,"terrain_loss":10.699137986989722,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44549549549549,"lon":30.512925802948985,"rsrp":-70.97647458216463,"distance":708.3653869240449,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44549549549549,"lon":30.520000000000003,"rsrp":-65.67424140939303,"distance":500.87804794920265,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44549549549549,"lon":30.52707419705102,"rsrp":-70.97647458217838,"distance":708.3653869246818,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44549549549549,"lon":30.53414839410204,"rsrp":-85.43476273758068,"distance":1120.0400111356714,"has_los":false,"terrain_loss":7.449380021280011,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44549549549549,"lon":30.54122259115306,"rsrp":-96.47889658356604,"distance":1583.9833103764704,"has_los":false,"terrain_loss":13.19157199132082,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.449999999999996,"lon":30.498777408846948,"rsrp":-99.25963429094779,"distance":1502.634138737969,"has_los":false,"terrain_loss":16.77886554574519,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.449999999999996,"lon":30.505851605897966,"rsrp":-90.75287448310992,"distance":1001.7560943833737,"has_los":false,"terrain_loss":14.474894913657883,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.449999999999996,"lon":30.512925802948985,"rsrp":-65.67424140358152,"distance":500.8780477589249,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.449999999999996,"lon":30.520000000000003,"rsrp":-41.02628268623123,"distance":1.0,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.449999999999996,"lon":30.52707419705102,"rsrp":-65.67424140360903,"distance":500.8780477598256,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.449999999999996,"lon":30.53414839410204,"rsrp":-84.59393951679196,"distance":1001.7560943842744,"has_los":false,"terrain_loss":8.315959947326165,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.449999999999996,"lon":30.54122259115306,"rsrp":-105.54934110763091,"distance":1502.6341387388698,"has_los":false,"terrain_loss":23.068572362419168,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4545045045045,"lon":30.498777408846948,"rsrp":-102.62285813304815,"distance":1583.8475970818356,"has_los":false,"terrain_loss":19.336844303076173,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4545045045045,"lon":30.505851605897966,"rsrp":-90.52066976194466,"distance":1119.9547099874599,"has_los":false,"terrain_loss":12.536452167671778,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4545045045045,"lon":30.512925802948985,"rsrp":-77.12300048826444,"distance":708.3316686838514,"has_los":false,"terrain_loss":6.14725410738236,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4545045045045,"lon":30.520000000000003,"rsrp":-65.67424140932823,"distance":500.8780479470807,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4545045045045,"lon":30.52707419705102,"rsrp":-84.15396244369077,"distance":708.3316686844882,"has_los":false,"terrain_loss":13.178216062794945,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4545045045045,"lon":30.53414839410204,"rsrp":-106.52383486481384,"distance":1119.9547099882654,"has_los":false,"terrain_loss":28.539617270529966,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4545045045045,"lon":30.54122259115306,"rsrp":-110.97226897048607,"distance":1583.8475970826903,"has_los":false,"terrain_loss":27.68625514050585,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.459009009009,"lon":30.498777408846948,"rsrp":-102.39979054827012,"distance":1805.822442875413,"has_los":false,"terrain_loss":17.107310596733527,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.459009009009,"lon":30.505851605897966,"rsrp":-97.94223772318932,"distance":1416.6296149347909,"has_los":false,"terrain_loss":16.363117318028877,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.459009009009,"lon":30.512925802948985,"rsrp":-101.48730370019045,"distance":1119.9760371515692,"has_los":false,"terrain_loss":23.502794791452278,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.459009009009,"lon":30.520000000000003,"rsrp":-96.71753352775028,"distance":1001.756095895576,"has_los":false,"terrain_loss":20.4395539352052,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.459009009009,"lon":30.52707419705102,"rsrp":-105.59213912455294,"distance":1119.9760371519722,"has_los":false,"terrain_loss":27.60763021580928,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.459009009009,"lon":30.53414839410204,"rsrp":-102.88500456677907,"distance":1416.6296149354278,"has_los":false,"terrain_loss":21.30588416161176,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.459009009009,"lon":30.54122259115306,"rsrp":-102.30073677134703,"distance":1805.8224428761623,"has_los":false,"terrain_loss":17.008256819804075,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.463513513513504,"lon":30.505851605897966,"rsrp":-106.69820419536616,"distance":1805.862124608583,"has_los":false,"terrain_loss":21.405388085134106,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.463513513513504,"lon":30.512925802948985,"rsrp":-107.88080590039576,"distance":1583.8928409228458,"has_los":false,"terrain_loss":24.594355078501078,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.463513513513504,"lon":30.520000000000003,"rsrp":-108.18549709241849,"distance":1502.6341438440713,"has_los":false,"terrain_loss":25.704728295231877,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.463513513513504,"lon":30.52707419705102,"rsrp":-107.93239495619693,"distance":1583.8928409231305,"has_los":false,"terrain_loss":24.64594413429949,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.463513513513504,"lon":30.53414839410204,"rsrp":-106.9967818996555,"distance":1805.8621246090827,"has_los":false,"terrain_loss":21.70396578941922,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0}],"count":45,"settings":{"radius":2000.0,"resolution":500.0,"min_signal":-120.0,"use_terrain":true,"use_buildings":false,"use_materials":false,"use_dominant_path":false,"use_street_canyon":false,"use_reflections":false,"use_water_reflection":false,"use_vegetation":false,"season":"summer","rain_rate":0.0,"indoor_loss_type":"none","use_atmospheric":false,"temperature_c":15.0,"humidity_percent":50.0,"preset":"fast"},"stats":{"min_rsrp":-110.97226897048607,"max_rsrp":-41.02628268623123,"avg_rsrp":-91.65667971854111,"los_percentage":20.0,"points_with_buildings":0,"points_with_terrain_loss":36,"points_with_reflection_gain":0,"points_with_vegetation_loss":0,"points_with_rain_loss":0,"points_with_indoor_loss":0,"points_with_atmospheric_loss":0},"computation_time":0.04,"models_used":["okumura_hata","terrain_los"]} \ No newline at end of file diff --git a/installer/coverage-result-standard.json b/installer/coverage-result-standard.json deleted file mode 100644 index 7ff69d4..0000000 --- a/installer/coverage-result-standard.json +++ /dev/null @@ -1 +0,0 @@ -{"points":[{"lat":50.407657657657666,"lon":30.504436766487764,"rsrp":-118.36905897474523,"distance":4835.596378529347,"has_los":false,"terrain_loss":18.008266429361925,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.407657657657666,"lon":30.508681284718374,"rsrp":-107.74855883225644,"distance":4776.03149578012,"has_los":false,"terrain_loss":7.57737680869138,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.407657657657666,"lon":30.512925802948985,"rsrp":-100.03868620664187,"distance":4734.84484694231,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.407657657657666,"lon":30.517170321179595,"rsrp":-99.96638012979761,"distance":4712.518325176134,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.407657657657666,"lon":30.521414839410205,"rsrp":-110.29631473767682,"distance":4709.32018139409,"has_los":false,"terrain_loss":10.34032007119822,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.407657657657666,"lon":30.534148394102036,"rsrp":-118.38975469046879,"distance":4813.737173732613,"has_los":false,"terrain_loss":18.098273009216243,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.41036036036037,"lon":30.508681284718374,"rsrp":-117.93069532544789,"distance":4480.049494629103,"has_los":false,"terrain_loss":18.738213731297122,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.41036036036037,"lon":30.512925802948985,"rsrp":-108.89918680710575,"distance":4436.118201437552,"has_los":false,"terrain_loss":9.857457116478757,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.41036036036037,"lon":30.517170321179595,"rsrp":-98.95930790879058,"distance":4412.281719310139,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.41036036036037,"lon":30.521414839410205,"rsrp":-114.56950877724876,"distance":4408.865987452211,"has_los":false,"terrain_loss":15.622048246001723,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.41036036036037,"lon":30.525659357640816,"rsrp":-119.55154125511388,"distance":4425.918285676699,"has_los":false,"terrain_loss":20.545026489963313,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.41036036036037,"lon":30.529903875871426,"rsrp":-118.96930331918031,"distance":4463.204017137285,"has_los":false,"terrain_loss":19.834452150817185,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.41036036036037,"lon":30.534148394102036,"rsrp":-115.32400197781784,"distance":4520.222513941234,"has_los":false,"terrain_loss":15.99495354588892,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.41036036036037,"lon":30.538392912332647,"rsrp":-119.24990092318384,"distance":4596.239452059636,"has_los":false,"terrain_loss":19.665724773180195,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.41306306306308,"lon":30.491703211795933,"rsrp":-107.53359338518436,"distance":4570.1516274128335,"has_los":false,"terrain_loss":8.03649438142895,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.41306306306308,"lon":30.495947730026543,"rsrp":-118.25202834379763,"distance":4446.5171247560465,"has_los":false,"terrain_loss":19.174479915843705,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.41306306306308,"lon":30.504436766487764,"rsrp":-119.44847506760087,"distance":4252.5631110598715,"has_los":false,"terrain_loss":21.053203975100892,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.41306306306308,"lon":30.508681284718374,"rsrp":-106.22012755013414,"distance":4184.715384424998,"has_los":false,"terrain_loss":8.07089650843586,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.41306306306308,"lon":30.512925802948985,"rsrp":-111.50362003744449,"distance":4137.652283468181,"has_los":false,"terrain_loss":13.527411184289965,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.41306306306308,"lon":30.517170321179595,"rsrp":-97.88139614642355,"distance":4112.087514336622,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.41306306306308,"lon":30.521414839410205,"rsrp":-113.40323328996914,"distance":4108.422418563122,"has_los":false,"terrain_loss":15.535478266666729,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.41306306306308,"lon":30.525659357640816,"rsrp":-118.98561262309052,"distance":4126.71534641711,"has_los":false,"terrain_loss":21.049893964969826,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.41306306306308,"lon":30.529903875871426,"rsrp":-118.2221695173976,"distance":4166.677101489764,"has_los":false,"terrain_loss":20.139023112308298,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.41306306306308,"lon":30.534148394102036,"rsrp":-113.38958561209485,"distance":4227.693262459474,"has_los":false,"terrain_loss":15.084042715369794,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.41306306306308,"lon":30.538392912332647,"rsrp":-114.78383134715745,"distance":4308.869493124901,"has_los":false,"terrain_loss":16.187335700876957,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.41306306306308,"lon":30.542637430563257,"rsrp":-118.11129799584666,"distance":4409.092426773278,"has_los":false,"terrain_loss":19.163051781650005,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.41306306306308,"lon":30.555370985255088,"rsrp":-114.78234513891663,"distance":4811.024583578883,"has_los":false,"terrain_loss":14.499486444735776,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.41306306306308,"lon":30.5596155034857,"rsrp":-118.72493071149512,"distance":4974.212717134709,"has_los":false,"terrain_loss":17.931777372413197,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.415765765765784,"lon":30.47472513887349,"rsrp":-118.85077668437361,"distance":4977.367832365733,"has_los":false,"terrain_loss":18.047923010851687,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.415765765765784,"lon":30.478969657104102,"rsrp":-108.6948527889869,"distance":4789.199220832177,"has_los":false,"terrain_loss":8.481551663263213,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.415765765765784,"lon":30.483214175334712,"rsrp":-112.9199080457682,"distance":4612.963387043163,"has_los":false,"terrain_loss":13.280169567002797,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.415765765765784,"lon":30.491703211795933,"rsrp":-109.25901567749847,"distance":4302.0606090185875,"has_los":false,"terrain_loss":10.68671301862468,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.415765765765784,"lon":30.495947730026543,"rsrp":-119.17983341859794,"distance":4170.493703723657,"has_los":false,"terrain_loss":21.082680767114127,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.415765765765784,"lon":30.500192248257154,"rsrp":-110.77595764778896,"distance":4056.978357747906,"has_los":false,"terrain_loss":13.10096710583583,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.415765765765784,"lon":30.504436766487764,"rsrp":-113.94945515602898,"distance":3963.066044620488,"has_los":false,"terrain_loss":16.632750043204947,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.415765765765784,"lon":30.508681284718374,"rsrp":-105.0896918215739,"distance":3890.1767275564653,"has_los":false,"terrain_loss":8.056968738997261,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.415765765765784,"lon":30.512925802948985,"rsrp":-96.83216098705043,"distance":3839.5078968398866,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.415765765765784,"lon":30.517170321179595,"rsrp":-96.72194747190753,"distance":3811.9457275941004,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.415765765765784,"lon":30.521414839410205,"rsrp":-113.75714938957297,"distance":3807.99198961748,"has_los":false,"terrain_loss":17.051077147892716,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.415765765765784,"lon":30.529903875871426,"rsrp":-118.879963820559,"distance":3870.767209023695,"has_los":false,"terrain_loss":21.923758921636306,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.415765765765784,"lon":30.534148394102036,"rsrp":-112.09067760358204,"distance":3936.369115755694,"has_los":false,"terrain_loss":14.877374850458528,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.415765765765784,"lon":30.538392912332647,"rsrp":-112.34309678578879,"distance":4023.4224565653403,"has_los":false,"terrain_loss":14.795164248327069,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.415765765765784,"lon":30.542637430563257,"rsrp":-115.47059194244517,"distance":4130.571162654008,"has_los":false,"terrain_loss":17.52058623526105,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.415765765765784,"lon":30.546881948793867,"rsrp":-119.10181211500645,"distance":4256.297852581791,"has_los":false,"terrain_loss":20.693111743978474,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.415765765765784,"lon":30.555370985255088,"rsrp":-117.69773772040675,"distance":4557.111826474922,"has_los":false,"terrain_loss":18.244350064811034,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.415765765765784,"lon":30.5596155034857,"rsrp":-115.3588566076566,"distance":4729.0603399949505,"has_los":false,"terrain_loss":15.338871173690908,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.415765765765784,"lon":30.56386002171631,"rsrp":-111.93552156542893,"distance":4913.401937224757,"has_los":false,"terrain_loss":11.330541546321937,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.41846846846849,"lon":30.47048062064288,"rsrp":-116.47979727785929,"distance":4959.265556565425,"has_los":false,"terrain_loss":15.732682443746377,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.41846846846849,"lon":30.47472513887349,"rsrp":-110.02365533945311,"distance":4751.41087370245,"has_los":false,"terrain_loss":9.931538846307326,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.41846846846849,"lon":30.478969657104102,"rsrp":-106.1128292983647,"distance":4553.926744627431,"has_los":false,"terrain_loss":6.670137516322927,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.41846846846849,"lon":30.483214175334712,"rsrp":-107.22964334322755,"distance":4368.219932720553,"has_los":false,"terrain_loss":8.423871338239268,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.41846846846849,"lon":30.487458693565323,"rsrp":-108.85435801987396,"distance":4195.854507926742,"has_los":false,"terrain_loss":10.664460060822359,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.41846846846849,"lon":30.491703211795933,"rsrp":-97.6053016065531,"distance":4038.53906920138,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.41846846846849,"lon":30.495947730026543,"rsrp":-104.77092565431856,"distance":3898.0961596877355,"has_los":false,"terrain_loss":7.707091386150222,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.41846846846849,"lon":30.500192248257154,"rsrp":-106.47127788155069,"distance":3776.4086941753826,"has_los":false,"terrain_loss":9.892615258338857,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.41846846846849,"lon":30.504436766487764,"rsrp":-103.40602324723488,"distance":3675.340077098328,"has_los":false,"terrain_loss":7.2423608010012614,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.41846846846849,"lon":30.508681284718374,"rsrp":-95.8324820876183,"distance":3596.628955462841,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.41846846846849,"lon":30.512925802948985,"rsrp":-95.59733003128684,"distance":3541.766241602616,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.41846846846849,"lon":30.517170321179595,"rsrp":-106.68215107067532,"distance":3511.869798874808,"has_los":false,"terrain_loss":11.214500919609536,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.41846846846849,"lon":30.521414839410205,"rsrp":-111.52871801483354,"distance":3507.5780769985263,"has_los":false,"terrain_loss":16.079774349248375,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.41846846846849,"lon":30.525659357640816,"rsrp":-116.33619840973766,"distance":3528.98449362267,"has_los":false,"terrain_loss":20.79417647681889,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.41846846846849,"lon":30.529903875871426,"rsrp":-116.94686233802221,"distance":3575.627532856778,"has_los":false,"terrain_loss":21.203969866181552,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.41846846846849,"lon":30.534148394102036,"rsrp":-111.00395983906697,"distance":3646.5389148674267,"has_los":false,"terrain_loss":14.960649372125946,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.41846846846849,"lon":30.538392912332647,"rsrp":-107.02107634549924,"distance":3740.3386165314205,"has_los":false,"terrain_loss":10.589233306709877,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.41846846846849,"lon":30.542637430563257,"rsrp":-116.27281122159286,"distance":3855.356400838092,"has_los":false,"terrain_loss":19.377634144468033,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.41846846846849,"lon":30.546881948793867,"rsrp":-114.82475868468153,"distance":3989.757647814848,"has_los":false,"terrain_loss":17.405365862406644,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.41846846846849,"lon":30.551126467024478,"rsrp":-116.72432228353853,"distance":4141.6557432164345,"has_los":false,"terrain_loss":18.733318770338652,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.41846846846849,"lon":30.555370985255088,"rsrp":-116.35464815316868,"distance":4309.200806938197,"has_los":false,"terrain_loss":17.75697627474988,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.41846846846849,"lon":30.5596155034857,"rsrp":-108.93199219194074,"distance":4490.6418228663815,"has_los":false,"terrain_loss":9.703383818155771,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.41846846846849,"lon":30.56386002171631,"rsrp":-116.06638725924216,"distance":4684.36435926904,"has_los":false,"terrain_loss":16.19167573090277,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.421171171171196,"lon":30.46623610241227,"rsrp":-116.48267790368291,"distance":4977.507840387515,"has_los":false,"terrain_loss":15.67939392098259,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.421171171171196,"lon":30.47048062064288,"rsrp":-110.91856015887664,"distance":4751.478418629125,"has_los":false,"terrain_loss":10.826226195109468,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.421171171171196,"lon":30.47472513887349,"rsrp":-108.95433932454303,"distance":4534.120948671153,"has_los":false,"terrain_loss":9.5783260578326,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.421171171171196,"lon":30.478969657104102,"rsrp":-105.52289857086292,"distance":4326.742556605676,"has_los":false,"terrain_loss":6.863078678927528,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.421171171171196,"lon":30.483214175334712,"rsrp":-106.34317794945017,"distance":4130.846437545938,"has_los":false,"terrain_loss":8.392152769670304,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.421171171171196,"lon":30.487458693565323,"rsrp":-104.98570634819733,"distance":3948.1421201506055,"has_los":false,"terrain_loss":7.726718305379547,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.421171171171196,"lon":30.491703211795933,"rsrp":-96.59539990699878,"distance":3780.5426709565804,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.421171171171196,"lon":30.495947730026543,"rsrp":-95.97436202237381,"distance":3630.14081722173,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.421171171171196,"lon":30.500192248257154,"rsrp":-95.41216236029194,"distance":3499.154841150892,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.421171171171196,"lon":30.504436766487764,"rsrp":-94.92660729570787,"distance":3389.836225902465,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.421171171171196,"lon":30.508681284718374,"rsrp":-94.535805364233,"distance":3304.3361608026935,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.421171171171196,"lon":30.512925802948985,"rsrp":-94.25642532450453,"distance":3244.5381920481873,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.421171171171196,"lon":30.517170321179595,"rsrp":-102.70109268943884,"distance":3211.878186969581,"has_los":false,"terrain_loss":8.59943920731265,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.421171171171196,"lon":30.521414839410205,"rsrp":-112.58771711527791,"distance":3207.1853219125123,"has_los":false,"terrain_loss":18.508431779822132,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.421171171171196,"lon":30.525659357640816,"rsrp":-114.65564592586732,"distance":3230.581477573004,"has_los":false,"terrain_loss":20.465168292889572,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.421171171171196,"lon":30.529903875871426,"rsrp":-113.9126431193901,"distance":3281.4659025929045,"has_los":false,"terrain_loss":19.483087444889705,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.421171171171196,"lon":30.534148394102036,"rsrp":-109.06226091336679,"distance":3358.589443194363,"has_los":false,"terrain_loss":14.277320870701127,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.421171171171196,"lon":30.538392912332647,"rsrp":-107.78420664336666,"distance":3460.1980312892206,"has_los":false,"terrain_loss":12.543314794566404,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.421171171171196,"lon":30.542637430563257,"rsrp":-111.29991823886172,"distance":3584.2098949450815,"has_los":false,"terrain_loss":15.520350996019882,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.421171171171196,"lon":30.546881948793867,"rsrp":-115.8627045422258,"distance":3728.3902036862128,"has_los":false,"terrain_loss":19.47980865575183,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.421171171171196,"lon":30.555370985255088,"rsrp":-115.29713209174969,"distance":4068.388837162399,"has_los":false,"terrain_loss":17.579175570823768,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.421171171171196,"lon":30.5596155034857,"rsrp":-111.2391306809519,"distance":4260.087910030136,"has_los":false,"terrain_loss":12.816814169333261,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4238738738739,"lon":30.46623610241227,"rsrp":-100.21393294083083,"distance":4789.39702176825,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4238738738739,"lon":30.47048062064288,"rsrp":-106.40545215658703,"distance":4554.054478840793,"has_los":false,"terrain_loss":6.9623312842997604,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4238738738739,"lon":30.47472513887349,"rsrp":-110.28613403931419,"distance":4326.804016592481,"has_los":false,"terrain_loss":11.626096846312235,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4238738738739,"lon":30.478969657104102,"rsrp":-108.18701043192087,"distance":4108.988469679362,"has_los":false,"terrain_loss":10.31714782808146,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4238738738739,"lon":30.483214175334712,"rsrp":-97.07988452754097,"distance":3902.1880964552042,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4238738738739,"lon":30.487458693565323,"rsrp":-107.43610818501529,"distance":3708.246228593195,"has_los":false,"terrain_loss":11.136089145251084,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4238738738739,"lon":30.491703211795933,"rsrp":-95.54331724460849,"distance":3529.2833130894405,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4238738738739,"lon":30.495947730026543,"rsrp":-107.14423016838522,"distance":3367.688195315755,"has_los":false,"terrain_loss":12.31790246887327,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4238738738739,"lon":30.500192248257154,"rsrp":-94.16910782477086,"distance":3226.0718104163952,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4238738738739,"lon":30.504436766487764,"rsrp":-93.59461080291152,"distance":3107.1670927679334,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4238738738739,"lon":30.508681284718374,"rsrp":-93.12718234947567,"distance":3013.6635234503387,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4238738738739,"lon":30.512925802948985,"rsrp":-100.88583106079959,"distance":2947.9791041348217,"has_los":false,"terrain_loss":8.095763287745525,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4238738738739,"lon":30.517170321179595,"rsrp":-101.26625138981342,"distance":2911.9969507501974,"has_los":false,"terrain_loss":8.664054855109727,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4238738738739,"lon":30.521414839410205,"rsrp":-104.48738184680047,"distance":2906.8202836693476,"has_los":false,"terrain_loss":11.91240475075046,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4238738738739,"lon":30.525659357640816,"rsrp":-110.72418648172399,"distance":2932.612241608681,"has_los":false,"terrain_loss":18.014070596865224,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4238738738739,"lon":30.529903875871426,"rsrp":-111.28265416467087,"distance":2988.571135999919,"has_los":false,"terrain_loss":18.28337903971152,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4238738738739,"lon":30.534148394102036,"rsrp":-106.45854726335824,"distance":3073.0494279082286,"has_los":false,"terrain_loss":13.032841866748868,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4238738738739,"lon":30.538392912332647,"rsrp":-106.04274236719559,"distance":3183.7777265802697,"has_los":false,"terrain_loss":12.075518411883163,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4238738738739,"lon":30.542637430563257,"rsrp":-107.7785391915139,"distance":3318.1291280441947,"has_los":false,"terrain_loss":13.179009952915365,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4238738738739,"lon":30.546881948793867,"rsrp":-110.13209927047137,"distance":3473.3634531733996,"has_los":false,"terrain_loss":14.833111925916734,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4238738738739,"lon":30.551126467024478,"rsrp":-113.92692482042698,"distance":3646.8148995013107,"has_los":false,"terrain_loss":17.882456586528534,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4238738738739,"lon":30.555370985255088,"rsrp":-118.26691398991075,"distance":3836.013113442071,"has_los":false,"terrain_loss":21.448683799732592,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.42657657657661,"lon":30.46199158418166,"rsrp":-100.45126333892955,"distance":4864.2783983050795,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.42657657657661,"lon":30.46623610241227,"rsrp":-99.64055255637538,"distance":4613.208871408993,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.42657657657661,"lon":30.47048062064288,"rsrp":-105.06905014009224,"distance":4368.399015793106,"has_los":false,"terrain_loss":6.262650980415137,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.42657657657661,"lon":30.47472513887349,"rsrp":-97.95145265215896,"distance":4130.961867797368,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.42657657657661,"lon":30.478969657104102,"rsrp":-109.39426764316981,"distance":3902.243466759899,"has_los":false,"terrain_loss":12.314166045948143,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.42657657657661,"lon":30.483214175334712,"rsrp":-102.56645271760189,"distance":3683.868120495178,"has_los":false,"terrain_loss":6.367334900123872,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.42657657657661,"lon":30.487458693565323,"rsrp":-109.68377268734064,"distance":3477.7847438542713,"has_los":false,"terrain_loss":14.365324747971256,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.42657657657661,"lon":30.491703211795933,"rsrp":-106.49199583044495,"distance":3286.3066297656237,"has_los":false,"terrain_loss":12.039889659232243,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.42657657657661,"lon":30.495947730026543,"rsrp":-108.95825078572238,"distance":3112.1307739542603,"has_los":false,"terrain_loss":15.339221080088294,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.42657657657661,"lon":30.500192248257154,"rsrp":-104.11117449545215,"distance":2958.314857528784,"has_los":false,"terrain_loss":11.267565158262572,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.42657657657661,"lon":30.504436766487764,"rsrp":-103.51075479109554,"distance":2828.182772406039,"has_los":false,"terrain_loss":11.355330720835248,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.42657657657661,"lon":30.508681284718374,"rsrp":-99.31877273618606,"distance":2725.129529072986,"has_los":false,"terrain_loss":7.731184710878795,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.42657657657661,"lon":30.512925802948985,"rsrp":-91.1732622277876,"distance":2652.313380129873,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.42657657657661,"lon":30.517170321179595,"rsrp":-90.94050505787365,"distance":2612.264103030681,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.42657657657661,"lon":30.521414839410205,"rsrp":-90.90666821931518,"distance":2606.4925443234015,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.42657657657661,"lon":30.525659357640816,"rsrp":-99.99194033491945,"distance":2635.223934584416,"has_los":false,"terrain_loss":8.917565191056147,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.42657657657661,"lon":30.529903875871426,"rsrp":-106.12421245283318,"distance":2697.355955166232,"has_los":false,"terrain_loss":14.693335866617481,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.42657657657661,"lon":30.534148394102036,"rsrp":-106.48003910277374,"distance":2790.6585733344873,"has_los":false,"terrain_loss":14.52894621533058,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.42657657657661,"lon":30.538392912332647,"rsrp":-92.60293374280704,"distance":2912.137283147899,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.42657657657661,"lon":30.542637430563257,"rsrp":-105.59070668222812,"distance":3058.4365279557283,"has_los":false,"terrain_loss":12.237919332238292,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.42657657657661,"lon":30.546881948793867,"rsrp":-115.0893491220672,"distance":3226.1814253045936,"has_los":false,"terrain_loss":20.919721514774515,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.42657657657661,"lon":30.551126467024478,"rsrp":-119.89855308394901,"distance":3412.2106225729576,"has_los":false,"terrain_loss":24.87130435532721,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.42657657657661,"lon":30.56386002171631,"rsrp":-116.24342214855682,"distance":4053.67961527142,"has_los":false,"terrain_loss":18.580875488475762,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.429279279279314,"lon":30.45774706595105,"rsrp":-110.61718984266926,"distance":4974.450493271538,"has_los":false,"terrain_loss":9.823305251584776,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.429279279279314,"lon":30.46199158418166,"rsrp":-106.27979649050589,"distance":4710.103342665466,"has_los":false,"terrain_loss":6.321257980407733,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.429279279279314,"lon":30.46623610241227,"rsrp":-99.09076270858853,"distance":4450.359657207398,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.429279279279314,"lon":30.47048062064288,"rsrp":-104.39637025803358,"distance":4196.074410386806,"has_los":false,"terrain_loss":6.205670562175183,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.429279279279314,"lon":30.47472513887349,"rsrp":-97.25960897269138,"distance":3948.3023747899133,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.429279279279314,"lon":30.478969657104102,"rsrp":-96.30044430479288,"distance":3708.349314841781,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.429279279279314,"lon":30.483214175334712,"rsrp":-95.31866468394742,"distance":3477.8340181563744,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.429279279279314,"lon":30.487458693565323,"rsrp":-114.36398908830651,"distance":3258.759902024805,"has_los":false,"terrain_loss":20.040655096532326,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.429279279279314,"lon":30.491703211795933,"rsrp":-104.51988102354659,"distance":3053.590439024373,"has_los":false,"terrain_loss":11.19135249733069,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.429279279279314,"lon":30.495947730026543,"rsrp":-92.35496456317446,"distance":2865.314096715965,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.429279279279314,"lon":30.500192248257154,"rsrp":-104.9419639943113,"distance":2697.4704842304054,"has_los":false,"terrain_loss":13.510437874280623,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.429279279279314,"lon":30.504436766487764,"rsrp":-106.67736664782588,"distance":2554.091030819298,"has_los":false,"terrain_loss":16.08138570830515,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.429279279279314,"lon":30.508681284718374,"rsrp":-103.52700770818292,"distance":2439.4931474688374,"has_los":false,"terrain_loss":13.633296597413658,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.429279279279314,"lon":30.512925802948985,"rsrp":-100.02618627473437,"distance":2357.8771137759354,"has_los":false,"terrain_loss":10.653043420703614,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.429279279279314,"lon":30.517170321179595,"rsrp":-89.07743529390495,"distance":2312.7373383831364,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.429279279279314,"lon":30.521414839410205,"rsrp":-95.63737561646202,"distance":2306.2166757017117,"has_los":false,"terrain_loss":6.603133177928231,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.429279279279314,"lon":30.525659357640816,"rsrp":-97.75188858672426,"distance":2338.638185048298,"has_los":false,"terrain_loss":8.504080368758212,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.429279279279314,"lon":30.529903875871426,"rsrp":-97.02052497075778,"distance":2408.429698310568,"has_los":false,"terrain_loss":7.3228623272519835,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.429279279279314,"lon":30.534148394102036,"rsrp":-90.34468896797827,"distance":2512.4789566519703,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.429279279279314,"lon":30.538392912332647,"rsrp":-99.83363808532314,"distance":2646.748806864713,"has_los":false,"terrain_loss":8.692504807998995,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.429279279279314,"lon":30.542637430563257,"rsrp":-105.61455811084979,"distance":2806.9057387995267,"has_los":false,"terrain_loss":13.57465902859842,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.429279279279314,"lon":30.546881948793867,"rsrp":-112.78564937058438,"distance":2988.7911008249357,"has_los":false,"terrain_loss":19.785248326508555,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.429279279279314,"lon":30.551126467024478,"rsrp":-117.35305415462564,"distance":3188.6888366213975,"has_los":false,"terrain_loss":23.362250638240866,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.429279279279314,"lon":30.555370985255088,"rsrp":-116.49616596795298,"distance":3403.426593853394,"has_los":false,"terrain_loss":21.508349443377508,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.429279279279314,"lon":30.5596155034857,"rsrp":-117.01932947063865,"distance":3630.3719490730796,"has_los":false,"terrain_loss":21.043993454816913,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43198198198202,"lon":30.45774706595105,"rsrp":-100.38252185664626,"distance":4842.469767844015,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43198198198202,"lon":30.46199158418166,"rsrp":-99.49830358592686,"distance":4570.511501522869,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43198198198202,"lon":30.46623610241227,"rsrp":-98.57338262664348,"distance":4302.364326027396,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43198198198202,"lon":30.47048062064288,"rsrp":-107.21041760679684,"distance":4038.7874028234496,"has_los":false,"terrain_loss":9.604175342972168,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43198198198202,"lon":30.47472513887349,"rsrp":-96.59618506362281,"distance":3780.7367095211916,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43198198198202,"lon":30.478969657104102,"rsrp":-102.51131876841403,"distance":3529.4245912050014,"has_los":false,"terrain_loss":6.967389154782821,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43198198198202,"lon":30.483214175334712,"rsrp":-103.90869514111833,"distance":3286.397317130853,"has_los":false,"terrain_loss":9.456166820439671,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43198198198202,"lon":30.487458693565323,"rsrp":-100.53867188073752,"distance":3053.6336085467583,"has_los":false,"terrain_loss":7.209927084202143,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43198198198202,"lon":30.491703211795933,"rsrp":-101.86634863428135,"distance":2833.663815173447,"has_los":false,"terrain_loss":9.681305675340289,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43198198198202,"lon":30.495947730026543,"rsrp":-97.17303589042753,"distance":2629.700465224201,"has_los":false,"terrain_loss":6.130759155063079,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43198198198202,"lon":30.500192248257154,"rsrp":-108.68677929423386,"distance":2445.7514135766887,"has_los":false,"terrain_loss":18.75387310987473,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43198198198202,"lon":30.504436766487764,"rsrp":-109.68862825075222,"distance":2286.6519064135696,"has_los":false,"terrain_loss":20.784719555779294,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43198198198202,"lon":30.508681284718374,"rsrp":-107.07114376852152,"distance":2157.9053342382144,"has_los":false,"terrain_loss":19.053762586705766,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43198198198202,"lon":30.512925802948985,"rsrp":-102.16783814425246,"distance":2065.196225583842,"has_los":false,"terrain_loss":14.822232509453627,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43198198198202,"lon":30.517170321179595,"rsrp":-94.88728619606138,"distance":2013.5086288064372,"has_los":false,"terrain_loss":7.929429699102489,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43198198198202,"lon":30.521414839410205,"rsrp":-86.90082362626521,"distance":2006.0159711622755,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43198198198202,"lon":30.525659357640816,"rsrp":-87.18182825617163,"distance":2043.2045137735072,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43198198198202,"lon":30.529903875871426,"rsrp":-87.76593908363307,"distance":2122.7272136159386,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43198198198202,"lon":30.534148394102036,"rsrp":-88.58912087550624,"distance":2240.0800187585337,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43198198198202,"lon":30.538392912332647,"rsrp":-99.25474816682211,"distance":2389.6961489865103,"has_los":false,"terrain_loss":9.676543229425668,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43198198198202,"lon":30.542637430563257,"rsrp":-100.1465730144723,"distance":2565.9381136893885,"has_los":false,"terrain_loss":9.479796958743755,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43198198198202,"lon":30.546881948793867,"rsrp":-102.21484740876224,"distance":2763.71681689777,"has_los":false,"terrain_loss":10.4121626244794,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43198198198202,"lon":30.551126467024478,"rsrp":-104.11654059363316,"distance":2978.745441154778,"has_los":false,"terrain_loss":11.16764430326289,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43198198198202,"lon":30.555370985255088,"rsrp":-109.35398406856604,"distance":3207.5566521647665,"has_los":false,"terrain_loss":15.272927626631542,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43198198198202,"lon":30.5596155034857,"rsrp":-117.45353632865745,"distance":3447.4072083704286,"has_los":false,"terrain_loss":22.26929905710132,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43198198198202,"lon":30.56386002171631,"rsrp":-119.57088270711328,"distance":3696.148637220559,"has_los":false,"terrain_loss":23.320852530151328,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.434684684684726,"lon":30.45774706595105,"rsrp":-100.00988577892161,"distance":4725.939262809106,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.434684684684726,"lon":30.46199158418166,"rsrp":-99.07878455013625,"distance":4446.876431509745,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.434684684684726,"lon":30.46623610241227,"rsrp":-98.0982922404284,"distance":4170.804387330433,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.434684684684726,"lon":30.47048062064288,"rsrp":-97.06486410718827,"distance":3898.358583339335,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.434684684684726,"lon":30.47472513887349,"rsrp":-95.97526679909618,"distance":3630.355523230527,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.434684684684726,"lon":30.478969657104102,"rsrp":-94.82708991103698,"distance":3367.8559925005184,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.434684684684726,"lon":30.483214175334712,"rsrp":-93.61962987353755,"distance":3112.2528711215336,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.434684684684726,"lon":30.487458693565323,"rsrp":-99.82648622629677,"distance":2865.3923070316832,"has_los":false,"terrain_loss":7.47110410262078,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.434684684684726,"lon":30.491703211795933,"rsrp":-101.75382128731816,"distance":2629.737517170564,"has_los":false,"terrain_loss":10.71132900831064,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.434684684684726,"lon":30.495947730026543,"rsrp":-104.78638328011044,"distance":2408.579860848026,"has_los":false,"terrain_loss":15.087766857901105,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.434684684684726,"lon":30.500192248257154,"rsrp":-110.41144868587894,"distance":2206.2832291970385,"has_los":false,"terrain_loss":22.05489176431824,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.434684684684726,"lon":30.504436766487764,"rsrp":-109.53877780169377,"distance":2028.498369809572,"has_los":false,"terrain_loss":22.467456129156503,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.434684684684726,"lon":30.508681284718374,"rsrp":-105.68925725289245,"distance":1882.1840492339284,"has_los":false,"terrain_loss":19.763186324665476,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.434684684684726,"lon":30.512925802948985,"rsrp":-100.68489582271425,"distance":1775.139196208085,"has_los":false,"terrain_loss":15.654581529659161,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.434684684684726,"lon":30.517170321179595,"rsrp":-94.91943902094896,"distance":1714.7340172073866,"has_los":false,"terrain_loss":10.418753332494202,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.434684684684726,"lon":30.521414839410205,"rsrp":-84.42193952426953,"distance":1705.930112120657,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.434684684684726,"lon":30.525659357640816,"rsrp":-84.80780546214845,"distance":1749.5066616129157,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.434684684684726,"lon":30.529903875871426,"rsrp":-85.59384572990515,"distance":1841.7493814417048,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.434684684684726,"lon":30.534148394102036,"rsrp":-101.85750384274516,"distance":1975.8540486073744,"has_los":false,"terrain_loss":15.188443042801989,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.434684684684726,"lon":30.538392912332647,"rsrp":-101.27931392588012,"distance":2143.9796802744295,"has_los":false,"terrain_loss":13.360975302181844,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.434684684684726,"lon":30.542637430563257,"rsrp":-89.2488726703364,"distance":2338.800916254826,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.434684684684726,"lon":30.546881948793867,"rsrp":-97.79667796227325,"distance":2554.216472401295,"has_los":false,"terrain_loss":7.199945697439959,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.434684684684726,"lon":30.551126467024478,"rsrp":-107.15726007365755,"distance":2785.4523962949324,"has_los":false,"terrain_loss":15.23473330128651,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.434684684684726,"lon":30.555370985255088,"rsrp":-107.43512081449725,"distance":3028.8875043922935,"has_los":false,"terrain_loss":14.230853025216415,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.434684684684726,"lon":30.5596155034857,"rsrp":-116.48027057782005,"distance":3281.8082165148858,"has_los":false,"terrain_loss":22.04911914340959,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43738738738743,"lon":30.45350254772044,"rsrp":-113.78647093830088,"distance":4913.2931624657085,"has_los":false,"terrain_loss":13.181829595004963,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43738738738743,"lon":30.45774706595105,"rsrp":-99.68299911517087,"distance":4626.026707644093,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43738738738743,"lon":30.46199158418166,"rsrp":-105.43025110788632,"distance":4340.561868384691,"has_los":false,"terrain_loss":6.721648467728964,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43738738738743,"lon":30.46623610241227,"rsrp":-112.78463894321158,"distance":4057.2789414826734,"has_los":false,"terrain_loss":15.108515009025155,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43738738738743,"lon":30.47048062064288,"rsrp":-106.53001830894954,"distance":3776.6689469382904,"has_los":false,"terrain_loss":9.950301456805988,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43738738738743,"lon":30.47472513887349,"rsrp":-95.4131246723853,"distance":3499.3749610114983,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43738738738743,"lon":30.478969657104102,"rsrp":-94.16996284160405,"distance":3226.2521235234317,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43738738738743,"lon":30.483214175334712,"rsrp":-99.74852875312848,"distance":2958.455894739441,"has_los":false,"terrain_loss":6.904190105385141,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43738738738743,"lon":30.487458693565323,"rsrp":-104.43318998294265,"distance":2697.573107978659,"has_los":false,"terrain_loss":13.001081871675153,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43738738738743,"lon":30.491703211795933,"rsrp":-104.7207553116218,"distance":2445.81703008811,"has_los":false,"terrain_loss":14.78743870724672,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43738738738743,"lon":30.495947730026543,"rsrp":-107.22190394134418,"distance":2206.3141436977958,"has_los":false,"terrain_loss":18.865132665845785,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43738738738743,"lon":30.500192248257154,"rsrp":-107.88052211965807,"distance":1983.5080399535047,"has_los":false,"terrain_loss":21.15231512370893,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43738738738743,"lon":30.504436766487764,"rsrp":-105.40723225616601,"distance":1783.6667512044328,"has_los":false,"terrain_loss":20.303604356788796,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43738738738743,"lon":30.508681284718374,"rsrp":-98.65493980071233,"distance":1615.3361592909498,"has_los":false,"terrain_loss":15.067770192261259,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43738738738743,"lon":30.512925802948985,"rsrp":-90.71177577804737,"distance":1489.2399507496114,"has_los":false,"terrain_loss":8.36798146523255,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43738738738743,"lon":30.517170321179595,"rsrp":-91.60868633190982,"distance":1416.7008332096357,"has_los":false,"terrain_loss":10.02879687112737,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43738738738743,"lon":30.521414839410205,"rsrp":-81.46425511649153,"distance":1406.0326340185052,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43738738738743,"lon":30.525659357640816,"rsrp":-82.02570028419171,"distance":1458.5935631050083,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43738738738743,"lon":30.529903875871426,"rsrp":-101.73613704065642,"distance":1568.0381033459387,"has_los":false,"terrain_loss":18.603590094862504,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43738738738743,"lon":30.534148394102036,"rsrp":-108.02703278086997,"distance":1723.5639531170552,"has_los":false,"terrain_loss":23.447773153322068,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43738738738743,"lon":30.538392912332647,"rsrp":-102.30549924188702,"distance":1913.970428580494,"has_los":false,"terrain_loss":16.123233186105587,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43738738738743,"lon":30.542637430563257,"rsrp":-98.92778107324733,"distance":2129.923424508997,"has_los":false,"terrain_loss":11.11006841855155,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43738738738743,"lon":30.546881948793867,"rsrp":-95.95794314116199,"distance":2364.4334788724345,"has_los":false,"terrain_loss":6.542321472282563,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43738738738743,"lon":30.551126467024478,"rsrp":-99.41297994753518,"distance":2612.508075253185,"has_los":false,"terrain_loss":8.471046204430344,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43738738738743,"lon":30.555370985255088,"rsrp":-108.97654030918673,"distance":2870.6326989002373,"has_los":false,"terrain_loss":16.593205960760116,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.43738738738743,"lon":30.5596155034857,"rsrp":-116.06172154951764,"distance":3136.326930916496,"has_los":false,"terrain_loss":22.32421342219737,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44009009009014,"lon":30.45350254772044,"rsrp":-108.02437552237166,"distance":4835.963930019275,"has_los":false,"terrain_loss":7.662420230131602,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44009009009014,"lon":30.45774706595105,"rsrp":-106.3161613709936,"distance":4543.828452386263,"has_los":false,"terrain_loss":6.907430348686087,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44009009009014,"lon":30.46199158418166,"rsrp":-106.60389530907594,"distance":4252.86696171327,"has_los":false,"terrain_loss":8.207531198291582,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44009009009014,"lon":30.46623610241227,"rsrp":-113.99579011173654,"distance":3963.338026051966,"has_los":false,"terrain_loss":16.678035150543003,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44009009009014,"lon":30.47048062064288,"rsrp":-103.17901634471957,"distance":3675.5801931977117,"has_los":false,"terrain_loss":7.014354489849217,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44009009009014,"lon":30.47472513887349,"rsrp":-102.05245082884193,"distance":3390.044504846066,"has_los":false,"terrain_loss":7.124903621894304,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44009009009014,"lon":30.478969657104102,"rsrp":-102.81857714644676,"distance":3107.3436050685455,"has_los":false,"terrain_loss":9.223097319944111,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44009009009014,"lon":30.483214175334712,"rsrp":-104.95976465977517,"distance":2828.327662770391,"has_los":false,"terrain_loss":12.80355688122145,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44009009009014,"lon":30.487458693565323,"rsrp":-104.75128887111471,"distance":2554.204575661582,"has_los":false,"terrain_loss":14.154627859552182,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44009009009014,"lon":30.491703211795933,"rsrp":-106.33877209532443,"distance":2286.73462032471,"has_los":false,"terrain_loss":17.43431004491675,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44009009009014,"lon":30.495947730026543,"rsrp":-106.2066355748413,"distance":2028.5512072904382,"has_los":false,"terrain_loss":19.134915432588834,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44009009009014,"lon":30.500192248257154,"rsrp":-105.06745981477061,"distance":1783.691494734728,"has_los":false,"terrain_loss":19.963619699225113,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44009009009014,"lon":30.504436766487764,"rsrp":-96.65619024454959,"distance":1558.4483533968837,"has_los":false,"terrain_loss":13.617489267990477,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44009009009014,"lon":30.508681284718374,"rsrp":-80.9840765620907,"distance":1362.5849582704038,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44009009009014,"lon":30.512925802948985,"rsrp":-87.55904174929644,"distance":1210.4482001115946,"has_los":false,"terrain_loss":8.386135032219796,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44009009009014,"lon":30.517170321179595,"rsrp":-86.45074821850336,"distance":1120.0011167085747,"has_los":false,"terrain_loss":8.465896747278276,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44009009009014,"lon":30.521414839410205,"rsrp":-77.79899901377877,"distance":1106.4767227635555,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44009009009014,"lon":30.525659357640816,"rsrp":-86.35062878761572,"distance":1172.5397882455875,"has_los":false,"terrain_loss":7.664480976621963,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44009009009014,"lon":30.529903875871426,"rsrp":-92.75814873470976,"distance":1306.1695724298434,"has_los":false,"terrain_loss":12.42094240582556,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44009009009014,"lon":30.534148394102036,"rsrp":-91.08920883141319,"distance":1489.2880606869294,"has_los":false,"terrain_loss":8.744920325548934,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44009009009014,"lon":30.538392912332647,"rsrp":-101.80776616268354,"distance":1706.033258948434,"has_los":false,"terrain_loss":17.384901695250747,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44009009009014,"lon":30.542637430563257,"rsrp":-97.31249927847813,"distance":1945.1968045628228,"has_los":false,"terrain_loss":10.882661524991194,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44009009009014,"lon":30.546881948793867,"rsrp":-88.30929595604971,"distance":2199.477735369923,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44009009009014,"lon":30.551126467024478,"rsrp":-102.13456440620094,"distance":2464.2005959171684,"has_los":false,"terrain_loss":12.086693272981062,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44009009009014,"lon":30.555370985255088,"rsrp":-114.07051507123273,"distance":2736.336494301331,"has_los":false,"terrain_loss":22.420143920955958,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.442792792792844,"lon":30.45350254772044,"rsrp":-109.62513801960709,"distance":4776.324662467776,"has_los":false,"terrain_loss":9.453016991605365,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.442792792792844,"lon":30.45774706595105,"rsrp":-108.78964506295107,"distance":4480.319590207003,"has_los":false,"terrain_loss":9.59624120512079,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.442792792792844,"lon":30.46199158418166,"rsrp":-108.81106004357474,"distance":4184.962386854212,"has_los":false,"terrain_loss":10.660926067854918,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.442792792792844,"lon":30.46623610241227,"rsrp":-108.41332381368795,"distance":3890.400613898706,"has_los":false,"terrain_loss":11.37972033258331,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.442792792792844,"lon":30.47048062064288,"rsrp":-107.23213016298129,"distance":3596.8297026506484,"has_los":false,"terrain_loss":11.398794237815686,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.442792792792844,"lon":30.47472513887349,"rsrp":-106.11926641094584,"distance":3304.5137473303403,"has_los":false,"terrain_loss":11.58263890315618,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.442792792792844,"lon":30.478969657104102,"rsrp":-103.58349609982616,"distance":3013.81793286869,"has_los":false,"terrain_loss":10.455529957252452,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.442792792792844,"lon":30.483214175334712,"rsrp":-106.15988383617407,"distance":2725.260757142646,"has_los":false,"terrain_loss":14.571559158363032,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.442792792792844,"lon":30.487458693565323,"rsrp":-105.95239150911237,"distance":2439.6012169031974,"has_los":false,"terrain_loss":16.058002714406708,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.442792792792844,"lon":30.491703211795933,"rsrp":-105.74390560499086,"distance":2157.990325876965,"has_los":false,"terrain_loss":17.725921906879876,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.442792792792844,"lon":30.495947730026543,"rsrp":-105.70700980191492,"distance":1882.246170359984,"has_los":false,"terrain_loss":19.78043397574759,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.442792792792844,"lon":30.500192248257154,"rsrp":-103.22732290529603,"distance":1615.375900191349,"has_los":false,"terrain_loss":19.639776937260418,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.442792792792844,"lon":30.504436766487764,"rsrp":-98.95818577413768,"distance":1362.6034672186904,"has_los":false,"terrain_loss":17.973901410518817,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.442792792792844,"lon":30.508681284718374,"rsrp":-85.66946232655951,"distance":1133.4008020832034,"has_los":false,"terrain_loss":7.5026723632024925,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.442792792792844,"lon":30.512925802948985,"rsrp":-75.38694199546927,"distance":945.0750280505907,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.442792792792844,"lon":30.517170321179595,"rsrp":-73.3281234290047,"distance":826.0729396363099,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.442792792792844,"lon":30.521414839410205,"rsrp":-72.98294750131177,"distance":807.6425308972659,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.442792792792844,"lon":30.525659357640816,"rsrp":-74.57139198852596,"distance":896.0115384789187,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.442792792792844,"lon":30.529903875871426,"rsrp":-77.21332504172261,"distance":1064.9165034066539,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.442792792792844,"lon":30.534148394102036,"rsrp":-89.87038466500094,"distance":1282.9333198007785,"has_los":false,"terrain_loss":9.807772922386635,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.442792792792844,"lon":30.538392912332647,"rsrp":-94.57099693178529,"distance":1529.1987793936232,"has_los":false,"terrain_loss":11.822142685693622,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.442792792792844,"lon":30.542637430563257,"rsrp":-101.72089030635806,"distance":1792.1049546549214,"has_los":false,"terrain_loss":16.54506118540047,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.442792792792844,"lon":30.546881948793867,"rsrp":-97.83598926298791,"distance":2065.3066806186844,"has_los":false,"terrain_loss":10.48956545335764,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.442792792792844,"lon":30.551126467024478,"rsrp":-105.32273024764717,"distance":2345.208616091097,"has_los":false,"terrain_loss":16.03200249592814,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.442792792792844,"lon":30.555370985255088,"rsrp":-116.84432327950584,"distance":2629.6721218452967,"has_los":false,"terrain_loss":25.80221142916658,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44549549549555,"lon":30.45350254772044,"rsrp":-107.97805776778144,"distance":4735.043837905444,"has_los":false,"terrain_loss":7.938728648430876,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44549549549555,"lon":30.45774706595105,"rsrp":-108.7350145833941,"distance":4436.302849994828,"has_los":false,"terrain_loss":9.692648145183052,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44549549549555,"lon":30.46199158418166,"rsrp":-107.85226964964812,"distance":4137.822578281314,"has_los":false,"terrain_loss":9.875431185899114,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44549549549555,"lon":30.46623610241227,"rsrp":-107.88798911507213,"distance":3839.6638254700456,"has_los":false,"terrain_loss":11.05520686570061,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44549549549555,"lon":30.47048062064288,"rsrp":-107.80110851808402,"distance":3541.9077902309323,"has_los":false,"terrain_loss":12.203167107641598,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44549549549555,"lon":30.47472513887349,"rsrp":-106.82644733562901,"distance":3244.6653451675897,"has_los":false,"terrain_loss":12.569422497367178,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44549549549555,"lon":30.478969657104102,"rsrp":-105.92877234763439,"distance":2948.09184424497,"has_los":false,"terrain_loss":13.13811954303434,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44549549549555,"lon":30.483214175334712,"rsrp":-105.8358211680767,"distance":2652.411687579759,"has_los":false,"terrain_loss":14.661991935037971,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44549549549555,"lon":30.487458693565323,"rsrp":-105.41772582775911,"distance":2357.9609671170006,"has_los":false,"terrain_loss":16.0440389410127,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44549549549555,"lon":30.491703211795933,"rsrp":-105.92696101095483,"distance":2065.2656035078494,"has_los":false,"terrain_loss":18.58084146716253,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44549549549555,"lon":30.495947730026543,"rsrp":-104.23467676963577,"distance":1775.1940841467515,"has_los":false,"terrain_loss":19.20388946548514,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44549549549555,"lon":30.500192248257154,"rsrp":-100.0978476557849,"distance":1489.2803618368496,"has_los":false,"terrain_loss":17.753638232679634,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44549549549555,"lon":30.504436766487764,"rsrp":-93.47063117407404,"distance":1210.4742439918678,"has_los":false,"terrain_loss":14.297395311177414,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44549549549555,"lon":30.508681284718374,"rsrp":-83.06404426036333,"distance":945.0871581445815,"has_los":false,"terrain_loss":7.676905915924675,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44549549549555,"lon":30.512925802948985,"rsrp":-70.9764745820674,"distance":708.3653869195433,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44549549549555,"lon":30.517170321179595,"rsrp":-66.80960353505341,"distance":539.4657091348159,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44549549549555,"lon":30.521414839410205,"rsrp":-65.97426787642118,"distance":510.7983232327583,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44549549549555,"lon":30.525659357640816,"rsrp":-69.45844735401954,"distance":641.4487887112346,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44549549549555,"lon":30.529903875871426,"rsrp":-73.97531484005785,"distance":861.770337970798,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44549549549555,"lon":30.534148394102036,"rsrp":-85.43476273754177,"distance":1120.040011132824,"has_los":false,"terrain_loss":7.449380021280011,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44549549549555,"lon":30.538392912332647,"rsrp":-92.94154235446311,"distance":1395.3426390193526,"has_los":false,"terrain_loss":11.594041259840075,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44549549549555,"lon":30.542637430563257,"rsrp":-99.5181937630776,"distance":1679.3220281788508,"has_los":false,"terrain_loss":15.336743149409456,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44549549549555,"lon":30.546881948793867,"rsrp":-103.58719381591861,"distance":1968.2260555830458,"has_los":false,"terrain_loss":16.977306703289926,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44549549549555,"lon":30.551126467024478,"rsrp":-113.15617621777032,"distance":2260.1670450375927,"has_los":false,"terrain_loss":24.43048836235515,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44549549549555,"lon":30.555370985255088,"rsrp":-119.35655956794733,"distance":2554.1038089891913,"has_los":false,"terrain_loss":28.760502092607457,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.44549549549555,"lon":30.57234905817753,"rsrp":-119.46473485653306,"distance":3740.362315150952,"has_los":false,"terrain_loss":23.03279489085177,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.448198198198256,"lon":30.45350254772044,"rsrp":-108.17410704263582,"distance":4712.603922377822,"has_los":false,"terrain_loss":8.2074490463925,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.448198198198256,"lon":30.45774706595105,"rsrp":-107.88695018208482,"distance":4412.3616175639845,"has_los":false,"terrain_loss":8.927365258057696,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.448198198198256,"lon":30.46199158418166,"rsrp":-107.15134445312184,"distance":4112.161709354432,"has_los":false,"terrain_loss":9.269672285770339,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.448198198198256,"lon":30.46623610241227,"rsrp":-107.88426515580198,"distance":3812.014215181676,"has_los":false,"terrain_loss":11.162042834494203,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.448198198198256,"lon":30.47048062064288,"rsrp":-106.93905408847098,"distance":3511.9325748811457,"has_los":false,"terrain_loss":11.471130482995822,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.448198198198256,"lon":30.47472513887349,"rsrp":-106.55468045044786,"distance":3211.935247221538,"has_los":false,"terrain_loss":12.452755196580783,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.448198198198256,"lon":30.478969657104102,"rsrp":-106.35711742067157,"distance":2912.048290950366,"has_los":false,"terrain_loss":13.754651176403078,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.448198198198256,"lon":30.483214175334712,"rsrp":-105.72858073173714,"distance":2612.3097186119335,"has_los":false,"terrain_loss":14.78780854188921,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.448198198198256,"lon":30.487458693565323,"rsrp":-104.69747930038668,"distance":2312.7772242747583,"has_los":false,"terrain_loss":15.619780177328897,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.448198198198256,"lon":30.491703211795933,"rsrp":-103.18359637402675,"distance":2013.5427790717458,"has_los":false,"terrain_loss":16.22548041705276,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.448198198198256,"lon":30.495947730026543,"rsrp":-100.62947689342383,"distance":1714.7624244372876,"has_los":false,"terrain_loss":16.12853777261356,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.448198198198256,"lon":30.500192248257154,"rsrp":-98.43867945032147,"distance":1416.7234875192921,"has_los":false,"terrain_loss":16.858545363464803,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.448198198198256,"lon":30.504436766487764,"rsrp":-90.87910786251328,"distance":1120.0180041755925,"has_los":false,"terrain_loss":12.894025729147103,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.448198198198256,"lon":30.508681284718374,"rsrp":-86.60731540382805,"distance":826.0840414169576,"has_los":false,"terrain_loss":13.278986383461657,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.448198198198256,"lon":30.512925802948985,"rsrp":-73.84644121975461,"distance":539.4710218112796,"has_los":false,"terrain_loss":7.036687030613107,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.448198198198256,"lon":30.517170321179595,"rsrp":-56.958876722654026,"distance":283.3421088110222,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.448198198198256,"lon":30.521414839410205,"rsrp":-53.36374086512862,"distance":224.0003257263357,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.448198198198256,"lon":30.525659357640816,"rsrp":-63.967653809163764,"distance":448.00576935171176,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.448198198198256,"lon":30.529903875871426,"rsrp":-71.42207750765786,"distance":729.3022833332321,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.448198198198256,"lon":30.534148394102036,"rsrp":-76.5782581003267,"distance":1021.613477863768,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.448198198198256,"lon":30.538392912332647,"rsrp":-88.51743958697212,"distance":1317.6289313520722,"has_los":false,"terrain_loss":8.046605668585538,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.448198198198256,"lon":30.542637430563257,"rsrp":-102.79283347282693,"distance":1615.3134451132414,"has_los":false,"terrain_loss":19.205878979374848,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.448198198198256,"lon":30.546881948793867,"rsrp":-111.46170672360842,"distance":1913.8883642965268,"has_los":false,"terrain_loss":25.280096604339807,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.448198198198256,"lon":30.551126467024478,"rsrp":-116.9864347410643,"distance":2212.993319550428,"has_los":false,"terrain_loss":28.583421900814052,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.448198198198256,"lon":30.555370985255088,"rsrp":-118.41058534243413,"distance":2512.4390153975282,"has_los":false,"terrain_loss":28.06613957035909,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.448198198198256,"lon":30.5596155034857,"rsrp":-118.97519890208298,"distance":2812.116602760883,"has_los":false,"terrain_loss":26.9069263381065,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45090090090096,"lon":30.45350254772044,"rsrp":-108.38716553215386,"distance":4709.274257066842,"has_los":false,"terrain_loss":8.431320048984592,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45090090090096,"lon":30.45774706595105,"rsrp":-109.0929395040578,"distance":4408.822953151164,"has_los":false,"terrain_loss":10.14562829471171,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45090090090096,"lon":30.46199158418166,"rsrp":-107.8266630112701,"distance":4108.382270800022,"has_los":false,"terrain_loss":9.959057481333284,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45090090090096,"lon":30.46623610241227,"rsrp":-110.01589063816702,"distance":3807.954725176773,"has_los":false,"terrain_loss":13.30996810077515,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45090090090096,"lon":30.47048062064288,"rsrp":-108.39866107413101,"distance":3507.543692943709,"has_los":false,"terrain_loss":12.949867371990331,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45090090090096,"lon":30.47472513887349,"rsrp":-105.98885904691744,"distance":3207.1538156025367,"has_los":false,"terrain_loss":11.909723994218755,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45090090090096,"lon":30.478969657104102,"rsrp":-107.1325782048143,"distance":2906.7916527765838,"has_los":false,"terrain_loss":14.557751787643822,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45090090090096,"lon":30.483214175334712,"rsrp":-106.26508812932403,"distance":2606.4667868700476,"has_los":false,"terrain_loss":15.358571085753283,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45090090090096,"lon":30.487458693565323,"rsrp":-105.66338461354886,"distance":2306.1937901110336,"has_los":false,"terrain_loss":16.629293984080896,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45090090090096,"lon":30.491703211795933,"rsrp":-104.34032818425,"distance":2005.9959563612147,"has_los":false,"terrain_loss":17.439657192444244,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45090090090096,"lon":30.495947730026543,"rsrp":-99.66194595086732,"distance":1705.912967725224,"has_los":false,"terrain_loss":15.240160170060093,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45090090090096,"lon":30.500192248257154,"rsrp":-94.74959797776671,"distance":1406.0183607363692,"has_los":false,"terrain_loss":13.285498158676713,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45090090090096,"lon":30.504436766487764,"rsrp":-95.82662532467972,"distance":1106.465323363895,"has_los":false,"terrain_loss":18.02778391788931,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45090090090096,"lon":30.508681284718374,"rsrp":-80.33247287427884,"distance":807.6340131184165,"has_los":false,"terrain_loss":7.349686713320582,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45090090090096,"lon":30.512925802948985,"rsrp":-72.5028549649195,"distance":510.7927119792448,"has_los":false,"terrain_loss":6.5287551415285545,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45090090090096,"lon":30.517170321179595,"rsrp":-53.36356609601273,"distance":223.99776668486845,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45090090090096,"lon":30.521414839410205,"rsrp":-46.354920082196855,"distance":141.66903133520216,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45090090090096,"lon":30.525659357640816,"rsrp":-62.72417963365612,"distance":413.03091844107524,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45090090090096,"lon":30.529903875871426,"rsrp":-70.97596776050798,"distance":708.3419191570789,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45090090090096,"lon":30.534148394102036,"rsrp":-76.35394525358936,"distance":1006.7429254280851,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45090090090096,"lon":30.538392912332647,"rsrp":-97.73141373707216,"distance":1306.1177850069557,"has_los":false,"terrain_loss":17.394813958571596,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45090090090096,"lon":30.542637430563257,"rsrp":-111.51791237115457,"distance":1605.9219543335068,"has_los":false,"terrain_loss":28.020160338352085,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45090090090096,"lon":30.546881948793867,"rsrp":-114.0910945099877,"distance":1905.9528536535443,"has_los":false,"terrain_loss":27.97304583006345,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45090090090096,"lon":30.551126467024478,"rsrp":-115.72636918057759,"distance":2206.1179786429125,"has_los":false,"terrain_loss":27.370958118756473,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45090090090096,"lon":30.555370985255088,"rsrp":-115.83352693398504,"distance":2506.3691039843197,"has_los":false,"terrain_loss":25.52608489190093,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45090090090096,"lon":30.5596155034857,"rsrp":-116.90105393761405,"distance":2806.678628714076,"has_los":false,"terrain_loss":24.862392681638706,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45090090090096,"lon":30.56386002171631,"rsrp":-117.03434990438863,"distance":3107.029618285739,"has_los":false,"terrain_loss":23.44041596424647,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45090090090096,"lon":30.56810453994692,"rsrp":-117.27252533833807,"distance":3407.411106938102,"has_los":false,"terrain_loss":22.266809420653928,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45090090090096,"lon":30.57234905817753,"rsrp":-117.2621439496736,"distance":3707.815681346144,"has_los":false,"terrain_loss":20.963901188172052,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45090090090096,"lon":30.57659357640814,"rsrp":-119.10647554250612,"distance":4008.2381500335327,"has_los":false,"terrain_loss":21.616386385024313,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45090090090096,"lon":30.58083809463875,"rsrp":-119.9220053482786,"distance":4308.674769086786,"has_los":false,"terrain_loss":21.326201054557927,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45360360360367,"lon":30.45350254772044,"rsrp":-111.14093395450338,"distance":4725.095241798948,"has_los":false,"terrain_loss":11.133780532573088,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45360360360367,"lon":30.45774706595105,"rsrp":-108.55030294927535,"distance":4425.73579657825,"has_los":false,"terrain_loss":9.544418961376739,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45360360360367,"lon":30.46199158418166,"rsrp":-109.94582827131224,"distance":4126.544385652962,"has_los":false,"terrain_loss":12.01074338726407,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45360360360367,"lon":30.46623610241227,"rsrp":-110.53503607751024,"distance":3827.5604148556517,"has_los":false,"terrain_loss":13.750552311499161,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45360360360367,"lon":30.47048062064288,"rsrp":-108.67243516302149,"distance":3528.8366123542833,"has_los":false,"terrain_loss":13.131054300984955,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45360360360367,"lon":30.47472513887349,"rsrp":-108.86802030717072,"distance":3230.4451544486637,"has_los":false,"terrain_loss":14.678188226638236,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45360360360367,"lon":30.478969657104102,"rsrp":-107.898509205665,"distance":2932.487495894498,"has_los":false,"terrain_loss":15.189044070185709,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45360360360367,"lon":30.483214175334712,"rsrp":-107.79347802435352,"distance":2635.110793821864,"has_los":false,"terrain_loss":16.719759697563504,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45360360360367,"lon":30.487458693565323,"rsrp":-107.5082690334369,"distance":2338.5366894096655,"has_los":false,"terrain_loss":18.261124753130552,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45360360360367,"lon":30.491703211795933,"rsrp":-105.19560869701925,"distance":2043.1147237463745,"has_los":false,"terrain_loss":18.01445273501164,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45360360360367,"lon":30.495947730026543,"rsrp":-102.6307260918446,"distance":1749.428672442118,"has_los":false,"terrain_loss":17.823602594431094,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45360360360367,"lon":30.500192248257154,"rsrp":-98.49000861129167,"distance":1458.5275342171772,"has_los":false,"terrain_loss":16.465000864217096,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45360360360367,"lon":30.504436766487764,"rsrp":-94.97543396361748,"distance":1172.486009193891,"has_los":false,"terrain_loss":16.289987816382975,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45360360360367,"lon":30.508681284718374,"rsrp":-82.27272002180646,"distance":895.9705929747994,"has_los":false,"terrain_loss":7.702027128091141,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45360360360367,"lon":30.512925802948985,"rsrp":-75.84237155777748,"distance":641.4219789627962,"has_los":false,"terrain_loss":6.384563604830598,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45360360360367,"lon":30.517170321179595,"rsrp":-74.24241026317837,"distance":447.9955333428928,"has_los":false,"terrain_loss":10.275105984887036,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45360360360367,"lon":30.521414839410205,"rsrp":-62.72428244334006,"distance":413.03369421768207,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45360360360367,"lon":30.525659357640816,"rsrp":-76.683290478432,"distance":566.668032613933,"has_los":false,"terrain_loss":9.121112502256809,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45360360360367,"lon":30.529903875871426,"rsrp":-72.98249038706717,"distance":807.618398308486,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45360360360367,"lon":30.534148394102036,"rsrp":-98.33571944088973,"distance":1078.8889126217125,"has_los":false,"terrain_loss":20.92298041389696,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45360360360367,"lon":30.538392912332647,"rsrp":-110.02726360741148,"distance":1362.4881955421733,"has_los":false,"terrain_loss":29.044273454610064,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45360360360367,"lon":30.542637430563257,"rsrp":-110.91889941713686,"distance":1652.0792555645776,"has_los":false,"terrain_loss":26.98765471620171,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45360360360367,"lon":30.546881948793867,"rsrp":-112.11698671227636,"distance":1944.987566530235,"has_los":false,"terrain_loss":25.68879459552726,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45360360360367,"lon":30.551126467024478,"rsrp":-112.88517835448539,"distance":2239.9121369874797,"has_los":false,"terrain_loss":24.297204020585816,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45360360360367,"lon":30.555370985255088,"rsrp":-113.36124470382842,"distance":2536.1496614039415,"has_los":false,"terrain_loss":22.87310443969998,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45360360360367,"lon":30.5596155034857,"rsrp":-112.46428528523363,"distance":2833.2883369306132,"has_los":false,"terrain_loss":20.28126953639726,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45360360360367,"lon":30.56386002171631,"rsrp":-112.59100762927928,"distance":3131.0716155432942,"has_los":false,"terrain_loss":18.879154684152226,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45360360360367,"lon":30.56810453994692,"rsrp":-113.67525119224096,"distance":3429.331579720088,"has_los":false,"terrain_loss":18.571436021426635,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45360360360367,"lon":30.57234905817753,"rsrp":-113.38046249902173,"distance":3727.9538167493424,"has_los":false,"terrain_loss":16.999357256892704,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45360360360367,"lon":30.57659357640814,"rsrp":-113.5538316515421,"distance":4026.857730680126,"has_los":false,"terrain_loss":15.992842999347987,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45360360360367,"lon":30.58083809463875,"rsrp":-114.21910508831134,"distance":4325.9849336386815,"has_los":false,"terrain_loss":15.561964140387385,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45360360360367,"lon":30.58508261286936,"rsrp":-114.07375709289802,"distance":4625.292103257354,"has_los":false,"terrain_loss":14.39318745813718,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45360360360367,"lon":30.58932713109997,"rsrp":-113.22100979874185,"distance":4924.746425711068,"has_los":false,"terrain_loss":12.580749235536302,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.456306306306374,"lon":30.45350254772044,"rsrp":-110.51925315053919,"distance":4759.875920295183,"has_los":false,"terrain_loss":10.399906276198243,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.456306306306374,"lon":30.45774706595105,"rsrp":-108.98541124366503,"distance":4462.867639847264,"has_los":false,"terrain_loss":9.851713076687789,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.456306306306374,"lon":30.46199158418166,"rsrp":-111.04820082432181,"distance":4166.361119142244,"has_los":false,"terrain_loss":12.96621459283133,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.456306306306374,"lon":30.46623610241227,"rsrp":-112.1031821791245,"distance":3870.471676406899,"has_los":false,"terrain_loss":15.148145322259406,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.456306306306374,"lon":30.47048062064288,"rsrp":-109.04293261759574,"distance":3575.352520641735,"has_los":false,"terrain_loss":13.301216802932434,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.456306306306374,"lon":30.47472513887349,"rsrp":-108.40736257809752,"distance":3281.2115032780493,"has_los":false,"terrain_loss":13.978992941072105,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.456306306306374,"lon":30.478969657104102,"rsrp":-109.68147518270668,"distance":2988.3374728440776,"has_los":false,"terrain_loss":16.683396184361317,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.456306306306374,"lon":30.483214175334712,"rsrp":-110.52277099467219,"distance":2697.1431960378227,"has_los":false,"terrain_loss":19.09310111204513,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.456306306306374,"lon":30.487458693565323,"rsrp":-108.53021332352357,"distance":2408.2380778545585,"has_los":false,"terrain_loss":18.833767870948616,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.456306306306374,"lon":30.491703211795933,"rsrp":-103.71469881493353,"distance":2122.557070023395,"has_los":false,"terrain_loss":15.949985962470937,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.456306306306374,"lon":30.495947730026543,"rsrp":-101.87539917704804,"distance":1841.601219534204,"has_los":false,"terrain_loss":16.282784160834904,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.456306306306374,"lon":30.500192248257154,"rsrp":-97.33969703362607,"distance":1567.91270551446,"has_los":false,"terrain_loss":14.208373532452097,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.456306306306374,"lon":30.504436766487764,"rsrp":-89.30878535517964,"distance":1306.0681909926118,"has_los":false,"terrain_loss":8.972766459724266,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.456306306306374,"lon":30.508681284718374,"rsrp":-94.01415871318596,"distance":1064.841141425626,"has_los":false,"terrain_loss":16.80191631540796,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.456306306306374,"lon":30.512925802948985,"rsrp":-90.6978546040057,"distance":861.7237752491869,"has_los":false,"terrain_loss":16.723366357633687,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.456306306306374,"lon":30.517170321179595,"rsrp":-71.42173128349245,"distance":729.2857779162372,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.456306306306374,"lon":30.521414839410205,"rsrp":-70.97609011083716,"distance":708.3475843706601,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.456306306306374,"lon":30.525659357640816,"rsrp":-80.89225684948255,"distance":807.6283354158099,"has_los":false,"terrain_loss":7.909578234236905,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.456306306306374,"lon":30.529903875871426,"rsrp":-100.2251207253296,"distance":991.6548941179334,"has_los":false,"terrain_loss":24.10218102083213,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.456306306306374,"lon":30.534148394102036,"rsrp":-103.76712105255018,"distance":1222.744454817883,"has_los":false,"terrain_loss":24.43959507862511,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.456306306306374,"lon":30.538392912332647,"rsrp":-108.3476540307128,"distance":1478.9987304849758,"has_los":false,"terrain_loss":26.10942427756432,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.456306306306374,"lon":30.542637430563257,"rsrp":-110.13442533910217,"distance":1749.3939395494313,"has_los":false,"terrain_loss":25.32760556810123,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.456306306306374,"lon":30.546881948793867,"rsrp":-111.48843571853689,"distance":2028.282458586644,"has_los":false,"terrain_loss":24.41874243141205,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.456306306306374,"lon":30.551126467024478,"rsrp":-112.74392199649421,"distance":2312.59355909574,"has_los":false,"terrain_loss":23.667437782590923,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.456306306306374,"lon":30.555370985255088,"rsrp":-112.300672522939,"distance":2600.5493390796296,"has_los":false,"terrain_loss":21.428925842774458,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.456306306306374,"lon":30.5596155034857,"rsrp":-109.85310167588338,"distance":2891.060949451404,"has_los":false,"terrain_loss":17.361288155035933,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.456306306306374,"lon":30.56386002171631,"rsrp":-111.4476706684333,"distance":3183.428750534744,"has_los":false,"terrain_loss":17.482123624897373,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.456306306306374,"lon":30.56810453994692,"rsrp":-114.49967304855619,"distance":3477.1845576640358,"has_los":false,"terrain_loss":19.18386541549176,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.456306306306374,"lon":30.57234905817753,"rsrp":-113.70147146272441,"distance":3772.0040988891146,"has_los":false,"terrain_loss":17.140661952257293,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.456306306306374,"lon":30.57659357640814,"rsrp":-112.0874967164238,"distance":4067.6560848594754,"has_los":false,"terrain_loss":14.372295739725587,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.456306306306374,"lon":30.58083809463875,"rsrp":-114.81400964320015,"distance":4363.971327640451,"has_los":false,"terrain_loss":16.02312393555725,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.456306306306374,"lon":30.58508261286936,"rsrp":-114.1648112235456,"distance":4660.823326967508,"has_los":false,"terrain_loss":14.367172634975704,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.456306306306374,"lon":30.58932713109997,"rsrp":-109.47609177485693,"distance":4958.115672930774,"has_los":false,"terrain_loss":8.732524424517136,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45900900900908,"lon":30.45350254772044,"rsrp":-111.3360460773739,"distance":4813.205296460684,"has_los":false,"terrain_loss":11.046254784845663,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45900900900908,"lon":30.45774706595105,"rsrp":-111.92410290101283,"distance":4519.720181745546,"has_los":false,"terrain_loss":12.596754625456574,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45900900900908,"lon":30.46199158418166,"rsrp":-111.27316066383044,"distance":4227.22061265233,"has_los":false,"terrain_loss":12.96932815190418,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45900900900908,"lon":30.46623610241227,"rsrp":-109.82569966428535,"distance":3935.926319748686,"has_los":false,"terrain_loss":12.61411785161276,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45900900900908,"lon":30.47048062064288,"rsrp":-109.4702366134247,"distance":3646.1261893152805,"has_los":false,"terrain_loss":13.4286577107629,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45900900900908,"lon":30.47472513887349,"rsrp":-109.82156304756087,"distance":3358.2070658260623,"has_los":false,"terrain_loss":15.038364785778906,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45900900900908,"lon":30.478969657104102,"rsrp":-111.03533824615374,"distance":3072.697760394178,"has_los":false,"terrain_loss":17.611383587274794,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45900900900908,"lon":30.483214175334712,"rsrp":-111.36037730729095,"distance":2790.338094874293,"has_los":false,"terrain_loss":19.411041334291355,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45900900900908,"lon":30.487458693565323,"rsrp":-106.74857244931687,"distance":2512.190313906839,"has_los":false,"terrain_loss":16.405641067789908,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45900900900908,"lon":30.491703211795933,"rsrp":-106.16205184530493,"distance":2239.8241003009402,"has_los":false,"terrain_loss":17.574678788659796,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45900900900908,"lon":30.495947730026543,"rsrp":-102.33432236669954,"distance":1975.6320935171739,"has_los":false,"terrain_loss":15.666980140519414,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45900900900908,"lon":30.500192248257154,"rsrp":-95.63224105524675,"distance":1723.3776959390045,"has_los":false,"terrain_loss":11.05463469325655,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45900900900908,"lon":30.504436766487764,"rsrp":-100.9600094354009,"distance":1489.1398675439455,"has_los":false,"terrain_loss":18.617243244598825,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45900900900908,"lon":30.508681284718374,"rsrp":-98.67940467373255,"distance":1282.826082575869,"has_los":false,"terrain_loss":18.618071703266065,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45900900900908,"lon":30.512925802948985,"rsrp":-101.4873037002942,"distance":1119.976037159161,"has_los":false,"terrain_loss":23.50279479145234,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45900900900908,"lon":30.517170321179595,"rsrp":-90.940530744842,"distance":1021.5910353008561,"has_los":false,"terrain_loss":14.362608710179364,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45900900900908,"lon":30.521414839410205,"rsrp":-101.36169983802961,"distance":1006.7514676490558,"has_los":false,"terrain_loss":25.007624781686026,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45900900900908,"lon":30.525659357640816,"rsrp":-104.93744972134795,"distance":1078.9101661066688,"has_los":false,"terrain_loss":27.524409336386867,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45900900900908,"lon":30.529903875871426,"rsrp":-106.31245533385611,"distance":1222.7608636443726,"has_los":false,"terrain_loss":26.984724067734376,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45900900900908,"lon":30.534148394102036,"rsrp":-102.88500456684396,"distance":1416.6296149414295,"has_los":false,"terrain_loss":21.305884161611846,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45900900900908,"lon":30.538392912332647,"rsrp":-98.67466093420579,"distance":1642.9038784009315,"has_los":false,"terrain_loss":14.828615406953856,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45900900900908,"lon":30.542637430563257,"rsrp":-101.29168930852614,"distance":1889.9802090516453,"has_los":false,"terrain_loss":15.302383851510314,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45900900900908,"lon":30.546881948793867,"rsrp":-107.95041407624419,"distance":2150.70118191939,"has_los":false,"terrain_loss":19.98419047395722,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45900900900908,"lon":30.551126467024478,"rsrp":-111.78094771172113,"distance":2420.661954948169,"has_los":false,"terrain_loss":22.005784373497825,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45900900900908,"lon":30.555370985255088,"rsrp":-111.55278241818365,"distance":2697.0894247784613,"has_los":false,"terrain_loss":20.123417524480573,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45900900900908,"lon":30.5596155034857,"rsrp":-112.81741260799649,"distance":2978.1834672578357,"has_los":false,"terrain_loss":19.87140272256087,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45900900900908,"lon":30.56386002171631,"rsrp":-113.30174799073961,"distance":3262.7381894837795,"has_los":false,"terrain_loss":18.959749670288893,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45900900900908,"lon":30.56810453994692,"rsrp":-112.23514731483408,"distance":3549.92148432336,"has_los":false,"terrain_loss":16.602632813852686,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45900900900908,"lon":30.57234905817753,"rsrp":-112.17227338357017,"distance":3839.1435130113828,"has_los":false,"terrain_loss":15.3415642997561,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45900900900908,"lon":30.57659357640814,"rsrp":-110.09470496438826,"distance":4129.975979597512,"has_los":false,"terrain_loss":12.146903732704995,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45900900900908,"lon":30.58083809463875,"rsrp":-111.5235795201542,"distance":4422.101149110283,"has_los":false,"terrain_loss":12.530264185325377,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.45900900900908,"lon":30.58508261286936,"rsrp":-112.08644857449734,"distance":4715.27876674062,"has_los":false,"terrain_loss":12.11111001532574,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.461711711711786,"lon":30.45350254772044,"rsrp":-111.94127035098643,"distance":4884.475856413528,"has_los":false,"terrain_loss":11.426618326653848,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.461711711711786,"lon":30.45774706595105,"rsrp":-111.95135492309976,"distance":4595.561575320503,"has_los":false,"terrain_loss":12.369435160405056,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.461711711711786,"lon":30.46199158418166,"rsrp":-111.49718778728328,"distance":4308.231187571464,"has_los":false,"terrain_loss":12.90295851191289,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.461711711711786,"lon":30.46623610241227,"rsrp":-110.74289546207419,"distance":4022.8240974766745,"has_los":false,"terrain_loss":13.197238190142492,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.461711711711786,"lon":30.47048062064288,"rsrp":-109.61356704921623,"distance":3739.7806702196585,"has_los":false,"terrain_loss":13.18400617741445,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.461711711711786,"lon":30.47472513887349,"rsrp":-111.16236835595133,"distance":3459.6810834327457,"has_los":false,"terrain_loss":15.923762167859353,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.461711711711786,"lon":30.478969657104102,"rsrp":-108.87112732481731,"distance":3183.302520804648,"has_los":false,"terrain_loss":14.906186890023543,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.461711711711786,"lon":30.483214175334712,"rsrp":-108.35516489739757,"distance":2911.704773331091,"has_los":false,"terrain_loss":15.754503372153383,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.461711711711786,"lon":30.487458693565323,"rsrp":-106.92290911032349,"distance":2646.360226555168,"has_los":false,"terrain_loss":15.78402195572097,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.461711711711786,"lon":30.491703211795933,"rsrp":-110.91966183125872,"distance":2389.3530983801684,"has_los":false,"terrain_loss":21.34365313598487,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.461711711711786,"lon":30.495947730026543,"rsrp":-110.01192954989017,"distance":2143.6842191423584,"has_los":false,"terrain_loss":22.095699278356847,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.461711711711786,"lon":30.500192248257154,"rsrp":-106.94951849252354,"distance":1913.725126634062,"has_los":false,"terrain_loss":20.76921320892791,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.461711711711786,"lon":30.504436766487764,"rsrp":-103.69114621679886,"distance":1705.8410589839596,"has_los":false,"terrain_loss":19.270005299058813,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.461711711711786,"lon":30.508681284718374,"rsrp":-105.25811979975961,"distance":1529.0623298186424,"has_los":false,"terrain_loss":22.51063064326234,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.461711711711786,"lon":30.512925802948985,"rsrp":-97.52215779534427,"distance":1395.262531583742,"has_los":false,"terrain_loss":16.17553499077698,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.461711711711786,"lon":30.517170321179595,"rsrp":-106.25627427848498,"distance":1317.6006566883523,"has_los":false,"terrain_loss":25.785768638659405,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.461711711711786,"lon":30.521414839410205,"rsrp":-107.21860206402617,"distance":1306.1291990267587,"has_los":false,"terrain_loss":26.88186859891401,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.461711711711786,"lon":30.525659357640816,"rsrp":-106.82345657254103,"distance":1362.521014250353,"has_los":false,"terrain_loss":25.84009793709425,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.461711711711786,"lon":30.529903875871426,"rsrp":-107.62119149263121,"distance":1479.0340020381723,"has_los":false,"terrain_loss":25.382596914021963,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.461711711711786,"lon":30.534148394102036,"rsrp":-105.551183416858,"distance":1642.9265589805177,"has_los":false,"terrain_loss":21.70492670000449,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.461711711711786,"lon":30.538392912332647,"rsrp":-101.25836710414958,"distance":1841.592194178605,"has_los":false,"terrain_loss":15.665827060666828,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.461711711711786,"lon":30.542637430563257,"rsrp":-97.56402303451561,"distance":2065.0191212898044,"has_los":false,"terrain_loss":10.21972935769828,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.461711711711786,"lon":30.546881948793867,"rsrp":-96.66821174193542,"distance":2306.0212835653924,"has_los":false,"terrain_loss":7.635265464271911,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.461711711711786,"lon":30.551126467024478,"rsrp":-103.02525912493208,"distance":2559.6391099357757,"has_los":false,"terrain_loss":12.396083501259245,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.461711711711786,"lon":30.555370985255088,"rsrp":-109.55524241103134,"distance":2822.4738450221475,"has_los":false,"terrain_loss":17.430729783881958,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.461711711711786,"lon":30.5596155034857,"rsrp":-110.63239111164368,"distance":3092.1760709578016,"has_los":false,"terrain_loss":17.11176637478302,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.461711711711786,"lon":30.56386002171631,"rsrp":-112.71759600390968,"distance":3367.095946333694,"has_los":false,"terrain_loss":17.89395887364588,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.461711711711786,"lon":30.56810453994692,"rsrp":-112.88055882705649,"distance":3646.0533970414235,"has_los":false,"terrain_loss":16.839285340166864,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.461711711711786,"lon":30.57234905817753,"rsrp":-113.80428866580758,"distance":3928.188339960436,"has_los":false,"terrain_loss":16.622812046767567,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.461711711711786,"lon":30.57659357640814,"rsrp":-114.71001306408367,"distance":4212.862433692142,"has_los":false,"terrain_loss":16.458230055735594,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.461711711711786,"lon":30.58083809463875,"rsrp":-112.44472207970193,"distance":4499.593772725963,"has_los":false,"terrain_loss":13.185648070376915,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.461711711711786,"lon":30.58508261286936,"rsrp":-111.17226251643974,"distance":4788.012774530583,"has_los":false,"terrain_loss":10.962751681407969,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.46441441441449,"lon":30.45350254772044,"rsrp":-113.05530792923679,"distance":4972.916274645205,"has_los":false,"terrain_loss":12.266142258579203,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.46441441441449,"lon":30.45774706595105,"rsrp":-111.62513581715487,"distance":4689.470608143893,"has_los":false,"terrain_loss":11.733757641376775,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.46441441441449,"lon":30.46199158418166,"rsrp":-111.77939226763164,"distance":4408.282040397257,"has_los":false,"terrain_loss":12.83395806030722,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.46441441441449,"lon":30.46623610241227,"rsrp":-108.69121893208998,"distance":4129.811638817264,"has_los":false,"terrain_loss":10.744026451837133,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.46441441441449,"lon":30.47048062064288,"rsrp":-109.84333594893576,"distance":3854.6485528086,"has_los":false,"terrain_loss":12.950967853461357,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.46441441441449,"lon":30.47472513887349,"rsrp":-107.04961310316921,"distance":3583.554720600174,"has_los":false,"terrain_loss":11.272842501067995,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.46441441441449,"lon":30.478969657104102,"rsrp":-104.49462061558107,"distance":3317.527857952419,"has_los":false,"terrain_loss":9.897863734310068,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.46441441441449,"lon":30.483214175334712,"rsrp":-108.67263364548683,"distance":3057.890683122428,"has_los":false,"terrain_loss":15.322576794513305,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.46441441441449,"lon":30.487458693565323,"rsrp":-103.95538989851711,"distance":2806.417193833215,"has_los":false,"terrain_loss":11.918153674505572,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.46441441441449,"lon":30.491703211795933,"rsrp":-104.7215144020646,"distance":2565.509150413038,"has_los":false,"terrain_loss":14.05729601201265,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.46441441441449,"lon":30.495947730026543,"rsrp":-100.7572161615897,"distance":2338.4342281067916,"has_los":false,"terrain_loss":11.510742165102194,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.46441441441449,"lon":30.500192248257154,"rsrp":-99.86198551639745,"distance":2129.62198158781,"has_los":false,"terrain_loss":12.046438098348718,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.46441441441449,"lon":30.504436766487764,"rsrp":-104.34647061675207,"distance":1944.9634031877326,"has_los":false,"terrain_loss":17.91846855373982,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.46441441441449,"lon":30.508681284718374,"rsrp":-108.62562582983342,"distance":1791.9411841547048,"has_los":false,"terrain_loss":23.45119476824603,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.46441441441449,"lon":30.512925802948985,"rsrp":-108.72005394930304,"distance":1679.226455698771,"has_los":false,"terrain_loss":24.539473987960918,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.46441441441449,"lon":30.517170321179595,"rsrp":-107.78030228053115,"distance":1615.2793836247452,"has_los":false,"terrain_loss":24.193670372643332,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.46441441441449,"lon":30.521414839410205,"rsrp":-108.16259857325852,"distance":1605.936238177206,"has_los":false,"terrain_loss":24.664710473629015,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.46441441441449,"lon":30.525659357640816,"rsrp":-108.43799412500996,"distance":1652.1236731551687,"has_los":false,"terrain_loss":24.506338130603616,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.46441441441449,"lon":30.529903875871426,"rsrp":-107.78566883655286,"distance":1749.4489925685039,"has_los":false,"terrain_loss":22.97836764987987,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.46441441441449,"lon":30.534148394102036,"rsrp":-106.75120597730862,"distance":1890.028740153972,"has_los":false,"terrain_loss":20.761507702764558,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.46441441441449,"lon":30.538392912332647,"rsrp":-105.7279231030237,"distance":2065.047992845966,"has_los":false,"terrain_loss":18.383415543035305,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.46441441441449,"lon":30.542637430563257,"rsrp":-99.76782797203657,"distance":2266.5426309217896,"has_los":false,"terrain_loss":10.999047657664455,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.46441441441449,"lon":30.546881948793867,"rsrp":-90.1954563920662,"distance":2488.0887224631647,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.46441441441449,"lon":30.551126467024478,"rsrp":-91.58573614061964,"distance":2724.799660251339,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.46441441441449,"lon":30.555370985255088,"rsrp":-92.91964611809973,"distance":2973.055429475059,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.46441441441449,"lon":30.5596155034857,"rsrp":-100.91415470481438,"distance":3230.195300737708,"has_los":false,"terrain_loss":6.725505866787774,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.46441441441449,"lon":30.56386002171631,"rsrp":-110.02995527840446,"distance":3494.258500144295,"has_los":false,"terrain_loss":14.639214229811621,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.46441441441449,"lon":30.56810453994692,"rsrp":-111.60868949638851,"distance":3763.788109830865,"has_los":false,"terrain_loss":15.081237573905073,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.46441441441449,"lon":30.57234905817753,"rsrp":-112.52144122908203,"distance":4037.689572533315,"has_los":false,"terrain_loss":14.919357849028072,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.46441441441449,"lon":30.57659357640814,"rsrp":-114.28461918025171,"distance":4315.130462011225,"has_los":false,"terrain_loss":15.665911086849471,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.46441441441449,"lon":30.58083809463875,"rsrp":-114.77754201693364,"distance":4595.469767960624,"has_los":false,"terrain_loss":15.195927870727875,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.46441441441449,"lon":30.58508261286936,"rsrp":-114.49907758644208,"distance":4878.207819289843,"has_los":false,"terrain_loss":14.004069381501768,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4671171171172,"lon":30.45774706595105,"rsrp":-111.5645083011465,"distance":4800.387036222358,"has_los":false,"terrain_loss":11.31551203052461,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4671171171172,"lon":30.46199158418166,"rsrp":-108.12482961256647,"distance":4526.1106763327825,"has_los":false,"terrain_loss":8.775866617142912,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4671171171172,"lon":30.46623610241227,"rsrp":-107.54178142019708,"distance":4255.373938105684,"has_los":false,"terrain_loss":9.136402137565454,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4671171171172,"lon":30.47048062064288,"rsrp":-107.01357770616465,"distance":3988.8976173094957,"has_los":false,"terrain_loss":9.59748286138256,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4671171171172,"lon":30.47472513887349,"rsrp":-104.47658211545759,"distance":3727.595526125178,"has_los":false,"terrain_loss":8.096947218588221,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4671171171172,"lon":30.478969657104102,"rsrp":-104.42006483234289,"distance":3472.635882830637,"has_los":false,"terrain_loss":9.124282308825775,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4671171171172,"lon":30.483214175334712,"rsrp":-110.59467919562556,"distance":3225.523044774983,"has_los":false,"terrain_loss":16.428173826622672,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4671171171172,"lon":30.487458693565323,"rsrp":-100.03045694539767,"distance":2988.204347888576,"has_los":false,"terrain_loss":7.033059458324606,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4671171171172,"lon":30.491703211795933,"rsrp":-103.84947253545702,"distance":2763.2044652242757,"has_los":false,"terrain_loss":12.04962402666332,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4671171171172,"lon":30.495947730026543,"rsrp":-111.77500021469396,"distance":2553.781508329056,"has_los":false,"terrain_loss":21.180873300619844,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4671171171172,"lon":30.500192248257154,"rsrp":-112.5466128144393,"distance":2364.078775193085,"has_los":false,"terrain_loss":23.133286261905823,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4671171171172,"lon":30.504436766487764,"rsrp":-106.05369886866116,"distance":2199.205381219585,"has_los":false,"terrain_loss":17.746297326428742,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4671171171172,"lon":30.508681284718374,"rsrp":-109.50206808070809,"distance":2065.1168381326793,"has_los":false,"terrain_loss":22.157050520504498,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4671171171172,"lon":30.512925802948985,"rsrp":-109.68029653138368,"distance":1968.1153920048482,"has_los":false,"terrain_loss":23.07126957129518,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4671171171172,"lon":30.517170321179595,"rsrp":-108.57240381492066,"distance":1913.848539823323,"has_los":false,"terrain_loss":22.39111202119686,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4671171171172,"lon":30.521414839410205,"rsrp":-108.55079091061113,"distance":1905.9700069096189,"has_los":false,"terrain_loss":22.432604552227318,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4671171171172,"lon":30.525659357640816,"rsrp":-109.2162659397421,"distance":1945.043572239495,"has_los":false,"terrain_loss":22.787633326196406,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4671171171172,"lon":30.529903875871426,"rsrp":-109.35674768874897,"distance":2028.3576422579288,"has_los":false,"terrain_loss":22.28648735263558,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4671171171172,"lon":30.534148394102036,"rsrp":-106.92718275335761,"distance":2150.777149577926,"has_los":false,"terrain_loss":18.960418801846735,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4671171171172,"lon":30.538392912332647,"rsrp":-107.55694903106547,"distance":2306.0826877980066,"has_los":false,"terrain_loss":18.52359540806435,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4671171171172,"lon":30.542637430563257,"rsrp":-104.69971786733437,"distance":2488.1237449313207,"has_los":false,"terrain_loss":14.504046141884501,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4671171171172,"lon":30.546881948793867,"rsrp":-97.82147640640524,"distance":2691.4809242662263,"has_los":false,"terrain_loss":6.4239561930824465,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4671171171172,"lon":30.551126467024478,"rsrp":-92.60059120582326,"distance":2911.6913892644266,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4671171171172,"lon":30.555370985255088,"rsrp":-93.78081061788606,"distance":3145.2172115685403,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4671171171172,"lon":30.5596155034857,"rsrp":-94.92421964000278,"distance":3389.307192622681,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4671171171172,"lon":30.56386002171631,"rsrp":-96.02357562182087,"distance":3641.8377991285656,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4671171171172,"lon":30.56810453994692,"rsrp":-97.07589364304485,"distance":3901.1702384983596,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4671171171172,"lon":30.57234905817753,"rsrp":-109.78250358818084,"distance":4166.034476973385,"has_los":false,"terrain_loss":11.701716761816805,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4671171171172,"lon":30.57659357640814,"rsrp":-110.45521844239188,"distance":4435.439622962388,"has_los":false,"terrain_loss":11.415829009683346,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4671171171172,"lon":30.58083809463875,"rsrp":-113.40787391601283,"distance":4708.606309623264,"has_los":false,"terrain_loss":13.454198397422592,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.4671171171172,"lon":30.58508261286936,"rsrp":-113.15865532597635,"distance":4984.916192416538,"has_los":false,"terrain_loss":12.332619310805546,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.469819819819904,"lon":30.45774706595105,"rsrp":-108.09003177945944,"distance":4927.162421842409,"has_los":false,"terrain_loss":7.442268139504349,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.469819819819904,"lon":30.46199158418166,"rsrp":-106.98865300842165,"distance":4660.368857261433,"has_los":false,"terrain_loss":7.192506173154603,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.469819819819904,"lon":30.46623610241227,"rsrp":-105.04068977803826,"distance":4397.920333774783,"has_los":false,"terrain_loss":6.131255890705459,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.469819819819904,"lon":30.47048062064288,"rsrp":-105.02741104389118,"distance":4140.643146718572,"has_los":false,"terrain_loss":7.04014819774558,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.469819819819904,"lon":30.47472513887349,"rsrp":-97.03031185079044,"distance":3889.5636145479575,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.469819819819904,"lon":30.478969657104102,"rsrp":-103.12357728501658,"distance":3645.9623692865944,"has_los":false,"terrain_loss":7.082685733394719,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.469819819819904,"lon":30.483214175334712,"rsrp":-103.38734180543905,"distance":3411.441797008515,"has_los":false,"terrain_loss":8.363540340082276,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.469819819819904,"lon":30.487458693565323,"rsrp":-100.10815368022205,"distance":3188.006544124499,"has_los":false,"terrain_loss":6.120623860659205,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.469819819819904,"lon":30.491703211795933,"rsrp":-99.32640874104185,"distance":2978.152678436919,"has_los":false,"terrain_loss":6.380557008589688,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.469819819819904,"lon":30.495947730026543,"rsrp":-111.80351515800128,"distance":2784.952080503557,"has_los":false,"terrain_loss":19.883736412730354,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.469819819819904,"lon":30.500192248257154,"rsrp":-114.54144282616204,"distance":2612.1025770200804,"has_los":false,"terrain_loss":23.60188372736082,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.469819819819904,"lon":30.504436766487764,"rsrp":-109.57240843105639,"distance":2463.8909727598084,"has_los":false,"terrain_loss":19.52645958469701,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.469819819819904,"lon":30.508681284718374,"rsrp":-107.8520633949862,"distance":2344.9935290898984,"has_los":false,"terrain_loss":18.56273873522232,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.469819819819904,"lon":30.512925802948985,"rsrp":-109.85604966731921,"distance":2260.0415155965024,"has_los":false,"terrain_loss":21.13121148262391,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.469819819819904,"lon":30.517170321179595,"rsrp":-109.98952272012238,"distance":2212.9477465956584,"has_los":false,"terrain_loss":21.58682491943148,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.469819819819904,"lon":30.521414839410205,"rsrp":-109.50149785439137,"distance":2206.138001800934,"has_los":false,"terrain_loss":21.145947945920515,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.469819819819904,"lon":30.525659357640816,"rsrp":-109.39114339043977,"distance":2239.9797128099617,"has_los":false,"terrain_loss":20.80270753992449,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.469819819819904,"lon":30.529903875871426,"rsrp":-109.5988143908151,"distance":2312.6890022442835,"has_los":false,"terrain_loss":20.521698827152548,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.469819819819904,"lon":30.534148394102036,"rsrp":-107.93033758375273,"distance":2420.766160498411,"has_los":false,"terrain_loss":18.154515707448148,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.469819819819904,"lon":30.538392912332647,"rsrp":-108.9623795895643,"distance":2559.7351933878217,"has_los":false,"terrain_loss":18.332629723506976,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.469819819819904,"lon":30.542637430563257,"rsrp":-108.10620416203602,"distance":2724.8737196800776,"has_los":false,"terrain_loss":16.52005223201544,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.469819819819904,"lon":30.546881948793867,"rsrp":-104.44656843111358,"distance":2911.7325400478335,"has_los":false,"terrain_loss":11.845761021535823,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.469819819819904,"lon":30.551126467024478,"rsrp":-93.6400358134523,"distance":3116.4070733041644,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.469819819819904,"lon":30.555370985255088,"rsrp":-102.38050756461134,"distance":3335.6193981743054,"has_los":false,"terrain_loss":7.700552660192543,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.469819819819904,"lon":30.5596155034857,"rsrp":-95.7046062683527,"distance":3566.6899990000093,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.469819819819904,"lon":30.56386002171631,"rsrp":-96.7039368816539,"distance":3807.4604895920643,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.469819819819904,"lon":30.56810453994692,"rsrp":-97.67207003842375,"distance":4056.2039219195826,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.469819819819904,"lon":30.57234905817753,"rsrp":-98.60597597964372,"distance":4311.540579857283,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.469819819819904,"lon":30.57659357640814,"rsrp":-99.50450962242493,"distance":4572.366030788882,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.469819819819904,"lon":30.58083809463875,"rsrp":-100.36773891647721,"distance":4837.792584630009,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47252252252261,"lon":30.46199158418166,"rsrp":-115.87026768061077,"distance":4809.680929297777,"has_los":false,"terrain_loss":15.591682097214404,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47252252252261,"lon":30.46623610241227,"rsrp":-99.44917428852466,"distance":4555.856878730741,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47252252252261,"lon":30.47048062064288,"rsrp":-105.5853118671154,"distance":4308.036660353012,"has_los":false,"terrain_loss":6.991773347825355,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47252252252261,"lon":30.47472513887349,"rsrp":-97.71392889053541,"distance":4067.3178571661197,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47252252252261,"lon":30.478969657104102,"rsrp":-105.57703931666956,"distance":3835.0379344785097,"has_los":false,"terrain_loss":8.762698619402931,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47252252252261,"lon":30.483214175334712,"rsrp":-103.4662019416101,"distance":3612.824946761105,"has_los":false,"terrain_loss":7.56498620088301,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47252252252261,"lon":30.487458693565323,"rsrp":-112.63390786253701,"distance":3402.651755288783,"has_los":false,"terrain_loss":17.649574533185604,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47252252252261,"lon":30.491703211795933,"rsrp":-109.84969464432646,"distance":3206.886430666932,"has_los":false,"terrain_loss":15.771835057333082,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47252252252261,"lon":30.495947730026543,"rsrp":-115.9187362827441,"distance":3028.324443391131,"has_los":false,"terrain_loss":22.71731260228737,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47252252252261,"lon":30.500192248257154,"rsrp":-115.29547394430719,"distance":2870.1783981378785,"has_los":false,"terrain_loss":22.91456081302605,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47252252252261,"lon":30.504436766487764,"rsrp":-110.04365280625963,"distance":2735.990842516053,"has_los":false,"terrain_loss":18.395214203886766,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47252252252261,"lon":30.508681284718374,"rsrp":-111.0529337956867,"distance":2629.4323525199748,"has_los":false,"terrain_loss":20.012216852669123,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47252252252261,"lon":30.512925802948985,"rsrp":-109.96942021249203,"distance":2553.963558362664,"has_los":false,"terrain_loss":19.374202799895986,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47252252252261,"lon":30.517170321179595,"rsrp":-109.46290724167173,"distance":2512.387703859768,"has_los":false,"terrain_loss":19.11877390300836,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47252252252261,"lon":30.521414839410205,"rsrp":-110.51094153935517,"distance":2506.3919981419626,"has_los":false,"terrain_loss":20.203359760342835,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47252252252261,"lon":30.525659357640816,"rsrp":-110.32985127030335,"distance":2536.2287907591476,"has_los":false,"terrain_loss":19.841233708291416,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47252252252261,"lon":30.529903875871426,"rsrp":-110.23458264320281,"distance":2600.6650815111348,"has_los":false,"terrain_loss":19.362155113143828,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47252252252261,"lon":30.534148394102036,"rsrp":-109.03189153710059,"distance":2697.222276457176,"has_los":false,"terrain_loss":17.601773123821637,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47252252252261,"lon":30.538392912332647,"rsrp":-108.50317083734186,"distance":2822.605871297389,"has_los":false,"terrain_loss":16.377942637394767,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47252252252261,"lon":30.542637430563257,"rsrp":-109.26088967525334,"distance":2973.1711272861367,"has_los":false,"terrain_loss":16.34064824161151,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47252252252261,"lon":30.546881948793867,"rsrp":-106.98036814031155,"distance":3145.303792657791,"has_los":false,"terrain_loss":13.199136408154716,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47252252252261,"lon":30.551126467024478,"rsrp":-101.97947748619036,"distance":3335.666663379675,"has_los":false,"terrain_loss":7.299305813598936,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47252252252261,"lon":30.555370985255088,"rsrp":-95.59540711033026,"distance":3541.321077130134,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47252252252261,"lon":30.5596155034857,"rsrp":-96.51106508362813,"distance":3759.7585813350174,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47252252252261,"lon":30.56386002171631,"rsrp":-97.41602597486687,"distance":3988.8796597247215,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47252252252261,"lon":30.56810453994692,"rsrp":-98.3028436145051,"distance":4226.947363649252,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47252252252261,"lon":30.57234905817753,"rsrp":-99.16679448037311,"distance":4472.533265323535,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47252252252261,"lon":30.57659357640814,"rsrp":-100.00511308321768,"distance":4724.465082513052,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47252252252261,"lon":30.58083809463875,"rsrp":-100.8164089622909,"distance":4981.780156417701,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.475225225225316,"lon":30.46199158418166,"rsrp":-117.56757038507791,"distance":4972.691034255236,"has_los":false,"terrain_loss":16.779097627076226,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.475225225225316,"lon":30.46623610241227,"rsrp":-115.19916926264426,"distance":4727.641406118693,"has_los":false,"terrain_loss":15.183774603586166,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.475225225225316,"lon":30.47048062064288,"rsrp":-117.98014653439128,"distance":4489.328100819197,"has_los":false,"terrain_loss":18.756014181860113,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.475225225225316,"lon":30.47472513887349,"rsrp":-98.41798583222032,"distance":4258.882098063158,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.475225225225316,"lon":30.478969657104102,"rsrp":-104.60938984033338,"distance":4037.6506853146743,"has_los":false,"terrain_loss":7.007453796519212,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.475225225225316,"lon":30.483214175334712,"rsrp":-109.77527579855968,"distance":3827.232132632656,"has_los":false,"terrain_loss":12.992104164379613,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.475225225225316,"lon":30.487458693565323,"rsrp":-117.53101731248594,"distance":3629.507535727283,"has_los":false,"terrain_loss":21.55932426657927,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.475225225225316,"lon":30.491703211795933,"rsrp":-114.67807083612547,"distance":3446.662229748197,"has_los":false,"terrain_loss":19.49713978411842,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.475225225225316,"lon":30.495947730026543,"rsrp":-115.292342725444,"distance":3281.1846219763534,"has_los":false,"terrain_loss":20.864098417363525,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.475225225225316,"lon":30.500192248257154,"rsrp":-110.98266376894644,"distance":3135.8254014053296,"has_los":false,"terrain_loss":17.247602131525394,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.475225225225316,"lon":30.504436766487764,"rsrp":-109.09031549796329,"distance":3013.49727108418,"has_los":false,"terrain_loss":15.963977102122337,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.475225225225316,"lon":30.508681284718374,"rsrp":-111.89821207112644,"distance":2917.0990881607268,"has_los":false,"terrain_loss":19.269235289214073,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.475225225225316,"lon":30.512925802948985,"rsrp":-110.22018624966793,"distance":2849.263907031775,"has_los":false,"terrain_loss":17.95115482561502,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.475225225225316,"lon":30.517170321179595,"rsrp":-111.41707608081036,"distance":2812.059560074443,"has_los":false,"terrain_loss":19.349113833132026,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.475225225225316,"lon":30.521414839410205,"rsrp":-111.59161365649514,"distance":2806.7043954274773,"has_los":false,"terrain_loss":19.552811958236802,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.475225225225316,"lon":30.525659357640816,"rsrp":-109.38603974869281,"distance":2833.3790063684983,"has_los":false,"terrain_loss":17.202534450216515,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.475225225225316,"lon":30.529903875871426,"rsrp":-110.31414327365867,"distance":2891.1969943551844,"has_los":false,"terrain_loss":17.821609892305627,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.475225225225316,"lon":30.534148394102036,"rsrp":-108.49333319941034,"distance":2978.3451716595455,"has_los":false,"terrain_loss":15.54649271356995,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.475225225225316,"lon":30.538392912332647,"rsrp":-107.66201924790268,"distance":3092.3447893464163,"has_los":false,"terrain_loss":14.140559831265776,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.475225225225316,"lon":30.542637430563257,"rsrp":-108.83342780019166,"distance":3230.354324506636,"has_los":false,"terrain_loss":14.644025856167591,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.475225225225316,"lon":30.546881948793867,"rsrp":-108.39678289116269,"distance":3389.4421747072975,"has_los":false,"terrain_loss":13.47195400880976,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.475225225225316,"lon":30.551126467024478,"rsrp":-106.96488903598893,"distance":3566.7890145390897,"has_los":false,"terrain_loss":11.259858084027515,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.475225225225316,"lon":30.555370985255088,"rsrp":-96.51128223977085,"distance":3759.811951878521,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.475225225225316,"lon":30.5596155034857,"rsrp":-97.32888627672918,"distance":3966.222934836624,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.475225225225316,"lon":30.56386002171631,"rsrp":-98.14676557608178,"distance":4184.0410173703885,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.475225225225316,"lon":30.56810453994692,"rsrp":-98.95686391878155,"distance":4411.576872993984,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.475225225225316,"lon":30.57234905817753,"rsrp":-99.7535275097606,"distance":4647.403379988961,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.475225225225316,"lon":30.57659357640814,"rsrp":-100.53294868956007,"distance":4890.32128168048,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47792792792802,"lon":30.46623610241227,"rsrp":-111.10460979702327,"distance":4911.821185502014,"has_los":false,"terrain_loss":10.504552267168378,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47792792792802,"lon":30.47472513887349,"rsrp":-113.81189893453819,"distance":4462.478194183614,"has_los":false,"terrain_loss":14.679535780117511,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47792792792802,"lon":30.483214175334712,"rsrp":-119.5205851477181,"distance":4052.5967277455297,"has_los":false,"terrain_loss":21.86212568377632,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47792792792802,"lon":30.487458693565323,"rsrp":-114.8391120706086,"distance":3866.425180678148,"has_los":false,"terrain_loss":17.900077272081987,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47792792792802,"lon":30.491703211795933,"rsrp":-115.13500799409863,"distance":3695.3312728928468,"has_los":false,"terrain_loss":18.88836117402749,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47792792792802,"lon":30.495947730026543,"rsrp":-112.21470965158625,"distance":3541.5009329195877,"has_los":false,"terrain_loss":16.618525611733272,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47792792792802,"lon":30.500192248257154,"rsrp":-110.61993305719675,"distance":3407.2731921240475,"has_los":false,"terrain_loss":15.614836336318906,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47792792792802,"lon":30.504436766487764,"rsrp":-108.98143265234435,"distance":3295.044531285591,"has_los":false,"terrain_loss":14.488704989433385,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47792792792802,"lon":30.508681284718374,"rsrp":-111.76835330099418,"distance":3207.1252598689152,"has_los":false,"terrain_loss":17.689354458298094,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47792792792802,"lon":30.512925802948985,"rsrp":-110.83769728078639,"distance":3145.554405130474,"has_los":false,"terrain_loss":17.055246681636426,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47792792792802,"lon":30.517170321179595,"rsrp":-110.77501350210434,"distance":3111.896321195688,"has_los":false,"terrain_loss":17.157136313637913,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47792792792802,"lon":30.521414839410205,"rsrp":-111.87082672208577,"distance":3107.0582594929415,"has_los":false,"terrain_loss":18.276751762999268,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47792792792802,"lon":30.525659357640816,"rsrp":-110.1147176615644,"distance":3131.1738146851735,"has_los":false,"terrain_loss":16.402365394444207,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47792792792802,"lon":30.529903875871426,"rsrp":-111.02484716999942,"distance":3183.585086508696,"has_los":false,"terrain_loss":17.058548872700037,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47792792792802,"lon":30.534148394102036,"rsrp":-109.26486235199366,"distance":3262.9288473110196,"has_los":false,"terrain_loss":14.921970122646606,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47792792792802,"lon":30.538392912332647,"rsrp":-108.84727639977814,"distance":3367.3018033467124,"has_los":false,"terrain_loss":14.022704013662175,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47792792792802,"lon":30.542637430563257,"rsrp":-108.22523199929324,"distance":3494.461949628737,"has_los":false,"terrain_loss":12.833600269151953,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47792792792802,"lon":30.546881948793867,"rsrp":-109.30129589873422,"distance":3642.023243680919,"has_los":false,"terrain_loss":13.276941315475401,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47792792792802,"lon":30.551126467024478,"rsrp":-107.35512325912772,"distance":3807.614529033954,"has_los":false,"terrain_loss":10.650567476336098,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47792792792802,"lon":30.555370985255088,"rsrp":-106.89821343346759,"distance":3988.991049873583,"has_los":false,"terrain_loss":9.481760266394026,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47792792792802,"lon":30.5596155034857,"rsrp":-98.14698301138984,"distance":4184.10048704371,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47792792792802,"lon":30.56386002171631,"rsrp":-98.885735315018,"distance":4391.112645518085,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47792792792802,"lon":30.56810453994692,"rsrp":-99.62467637507459,"distance":4608.42377934423,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.47792792792802,"lon":30.57234905817753,"rsrp":-100.35778343539081,"distance":4834.645309894536,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.48063063063073,"lon":30.483214175334712,"rsrp":-118.33520667485868,"distance":4287.191087176383,"has_los":false,"terrain_loss":19.815871048030065,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.48063063063073,"lon":30.487458693565323,"rsrp":-113.61648066279139,"distance":4111.665738530336,"has_los":false,"terrain_loss":15.736653704894817,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.48063063063073,"lon":30.491703211795933,"rsrp":-112.15982251746689,"distance":3951.2148322419134,"has_los":false,"terrain_loss":14.888933194372868,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.48063063063073,"lon":30.495947730026543,"rsrp":-111.73784190801612,"distance":3807.7444685220735,"has_los":false,"terrain_loss":15.032764072578917,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.48063063063073,"lon":30.500192248257154,"rsrp":-110.55013962568357,"distance":3683.2394722762524,"has_los":false,"terrain_loss":14.353632611840123,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.48063063063073,"lon":30.504436766487764,"rsrp":-111.97344254173952,"distance":3579.6792972685676,"has_los":false,"terrain_loss":16.213224820265214,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.48063063063073,"lon":30.508681284718374,"rsrp":-110.8844191390388,"distance":3498.924195162522,"has_los":false,"terrain_loss":15.473265173536515,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.48063063063073,"lon":30.512925802948985,"rsrp":-108.6630937512936,"distance":3442.579406288456,"has_los":false,"terrain_loss":13.500294993839123,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.48063063063073,"lon":30.517170321179595,"rsrp":-111.5706650217082,"distance":3411.8545115366433,"has_los":false,"terrain_loss":16.54501292865832,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.48063063063073,"lon":30.521414839410205,"rsrp":-112.01921469791394,"distance":3407.4426249103394,"has_los":false,"terrain_loss":17.013357277355922,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.48063063063073,"lon":30.525659357640816,"rsrp":-110.60004921789063,"distance":3429.445300801332,"has_los":false,"terrain_loss":15.495726755284085,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.48063063063073,"lon":30.529903875871426,"rsrp":-111.6089186480844,"distance":3477.361168299798,"has_los":false,"terrain_loss":16.292334031839367,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.48063063063073,"lon":30.534148394102036,"rsrp":-110.03306510430751,"distance":3550.141139702552,"has_los":false,"terrain_loss":14.39960405412181,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.48063063063073,"lon":30.538392912332647,"rsrp":-108.99754004620317,"distance":3646.2966583297066,"has_los":false,"terrain_loss":12.955245927678897,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.48063063063073,"lon":30.542637430563257,"rsrp":-107.76740824306351,"distance":3764.0367052876377,"has_los":false,"terrain_loss":11.238945934825654,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.48063063063073,"lon":30.546881948793867,"rsrp":-107.99694919338228,"distance":3901.4075797821693,"has_los":false,"terrain_loss":10.920124873920347,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.48063063063073,"lon":30.551126467024478,"rsrp":-110.64579809845024,"distance":4056.415372172248,"has_los":false,"terrain_loss":12.972930596841126,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.48063063063073,"lon":30.555370985255088,"rsrp":-107.3822242493561,"distance":4227.120298591785,"has_los":false,"terrain_loss":9.07875476999528,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.48063063063073,"lon":30.5596155034857,"rsrp":-98.95729294197213,"distance":4411.700595063093,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.48063063063073,"lon":30.56386002171631,"rsrp":-99.6248940188338,"distance":4608.489343757913,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.48063063063073,"lon":30.56810453994692,"rsrp":-100.29864010486193,"distance":4815.990208266928,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.483333333333434,"lon":30.478969657104102,"rsrp":-117.10629802068212,"distance":4708.687797299318,"has_los":false,"terrain_loss":17.152357756139455,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.483333333333434,"lon":30.483214175334712,"rsrp":-113.64101239731279,"distance":4529.581364514566,"has_los":false,"terrain_loss":14.28032319630618,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.483333333333434,"lon":30.487458693565323,"rsrp":-113.77966418778045,"distance":4363.826228755774,"has_los":false,"terrain_loss":14.989287134695832,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.483333333333434,"lon":30.491703211795933,"rsrp":-112.70193827204533,"distance":4212.998555459982,"has_los":false,"terrain_loss":14.449660979391023,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.483333333333434,"lon":30.495947730026543,"rsrp":-112.073884654518,"distance":4078.7546828135833,"has_los":false,"terrain_loss":14.317000039980885,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.483333333333434,"lon":30.500192248257154,"rsrp":-108.7461971171652,"distance":3962.780357426849,"has_los":false,"terrain_loss":11.430594834545412,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.483333333333434,"lon":30.504436766487764,"rsrp":-112.23525034036365,"distance":3866.719802009879,"has_los":false,"terrain_loss":15.295049882715112,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.483333333333434,"lon":30.508681284718374,"rsrp":-110.13255948278177,"distance":3792.0866766426493,"has_los":false,"terrain_loss":13.490517947995066,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.483333333333434,"lon":30.512925802948985,"rsrp":-109.10640692041572,"distance":3740.163922987887,"has_los":false,"terrain_loss":12.675278393763348,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.483333333333434,"lon":30.517170321179595,"rsrp":-110.27427848194186,"distance":3711.9046932107985,"has_los":false,"terrain_loss":13.95917429032413,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.483333333333434,"lon":30.521414839410205,"rsrp":-112.50861002962408,"distance":3707.8500786626732,"has_los":false,"terrain_loss":16.2102253499708,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.483333333333434,"lon":30.525659357640816,"rsrp":-110.98202213701464,"distance":3728.079054150229,"has_los":false,"terrain_loss":14.600402981697675,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.483333333333434,"lon":30.529903875871426,"rsrp":-112.2978920790276,"distance":3772.2009670024117,"has_los":false,"terrain_loss":15.736284159558146,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.483333333333434,"lon":30.534148394102036,"rsrp":-110.71681668888199,"distance":3839.3921796476193,"has_los":false,"terrain_loss":13.885116767092978,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.483333333333434,"lon":30.538392912332647,"rsrp":-109.46244536363778,"distance":3928.4691615666584,"has_los":false,"terrain_loss":12.279875150321026,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.483333333333434,"lon":30.542637430563257,"rsrp":-108.68690877082558,"distance":4037.983787228045,"has_los":false,"terrain_loss":11.083710713498892,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.483333333333434,"lon":30.546881948793867,"rsrp":-106.63248914266654,"distance":4166.324716570084,"has_los":false,"terrain_loss":8.550636573988182,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.483333333333434,"lon":30.551126467024478,"rsrp":-109.40740751474583,"distance":4311.811183702333,"has_los":false,"terrain_loss":10.800471424220564,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.483333333333434,"lon":30.555370985255088,"rsrp":-109.81495782748941,"distance":4472.7704146181295,"has_los":false,"terrain_loss":10.64735221746211,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.483333333333434,"lon":30.5596155034857,"rsrp":-106.62051453696532,"distance":4647.595091360171,"has_los":false,"terrain_loss":6.866355979659743,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.483333333333434,"lon":30.56386002171631,"rsrp":-100.35821383689955,"distance":4834.78133246492,"has_los":true,"terrain_loss":0.0,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.48603603603614,"lon":30.478969657104102,"rsrp":-113.54741674276468,"distance":4948.674450655662,"has_los":false,"terrain_loss":12.833007472344262,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.48603603603614,"lon":30.483214175334712,"rsrp":-112.90540983983212,"distance":4778.581379144108,"has_los":false,"terrain_loss":12.726062542299893,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.48603603603614,"lon":30.487458693565323,"rsrp":-112.72005061431254,"distance":4621.774151328672,"has_los":false,"terrain_loss":13.051120885816387,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.48603603603614,"lon":30.491703211795933,"rsrp":-112.62470105912445,"distance":4479.648172540787,"has_los":false,"terrain_loss":13.433589915112456,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.48603603603614,"lon":30.495947730026543,"rsrp":-110.88825525771387,"distance":4353.641502570017,"has_los":false,"terrain_loss":12.13362381665797,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.48603603603614,"lon":30.500192248257154,"rsrp":-108.96451888045844,"distance":4245.18975535603,"has_los":false,"terrain_loss":10.595795355140002,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.48603603603614,"lon":30.504436766487764,"rsrp":-111.729791907333,"distance":4155.667567435036,"has_los":false,"terrain_loss":13.687120517867593,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.48603603603614,"lon":30.508681284718374,"rsrp":-109.40556336664028,"distance":4086.3192424858553,"has_los":false,"terrain_loss":11.620333052071148,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.48603603603614,"lon":30.512925802948985,"rsrp":-108.98054272977798,"distance":4038.184260565873,"has_los":false,"terrain_loss":11.376585195138702,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.48603603603614,"lon":30.517170321179595,"rsrp":-110.61865521602056,"distance":4012.026226811512,"has_los":false,"terrain_loss":13.11411519994465,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.48603603603614,"lon":30.521414839410205,"rsrp":-112.09023822314263,"distance":4008.2754295609525,"has_los":false,"terrain_loss":14.600006784173482,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.48603603603614,"lon":30.525659357640816,"rsrp":-111.15821206945512,"distance":4026.994480524652,"has_los":false,"terrain_loss":13.596703915868602,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.48603603603614,"lon":30.529903875871426,"rsrp":-112.54753526628386,"distance":4067.8731943110397,"has_los":false,"terrain_loss":14.831517789097656,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.48603603603614,"lon":30.534148394102036,"rsrp":-112.78313786919558,"distance":4130.253654994648,"has_los":false,"terrain_loss":14.834308126818447,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.48603603603614,"lon":30.538392912332647,"rsrp":-110.09003780769338,"distance":4213.180904413379,"has_los":false,"terrain_loss":11.837098395961636,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.48603603603614,"lon":30.542637430563257,"rsrp":-109.71910036474198,"distance":4315.470606884585,"has_los":false,"terrain_loss":11.099186440414327,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.48603603603614,"lon":30.546881948793867,"rsrp":-106.31380786494879,"distance":4435.783462756618,"has_los":false,"terrain_loss":7.273232564735967,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.48603603603614,"lon":30.551126467024478,"rsrp":-110.04757691630518,"distance":4572.697063945521,"has_los":false,"terrain_loss":10.541959782187533,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.48603603603614,"lon":30.555370985255088,"rsrp":-110.55594868590501,"distance":4724.768468963436,"has_los":false,"terrain_loss":10.549853259747431,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.48603603603614,"lon":30.5596155034857,"rsrp":-107.79260721444918,"distance":4890.583898057029,"has_los":false,"terrain_loss":7.258837027311918,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.488738738738846,"lon":30.487458693565323,"rsrp":-113.24561202921304,"distance":4884.592715749614,"has_los":false,"terrain_loss":12.7305940110309,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.488738738738846,"lon":30.491703211795933,"rsrp":-112.84886637235358,"distance":4750.34434697736,"has_los":false,"terrain_loss":12.760184125490394,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.488738738738846,"lon":30.495947730026543,"rsrp":-111.32748607638366,"distance":4631.714763297767,"has_los":false,"terrain_loss":11.625688496838375,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.488738738738846,"lon":30.500192248257154,"rsrp":-111.50166253119664,"distance":4529.931202949989,"has_los":false,"terrain_loss":12.139791850606796,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.488738738738846,"lon":30.504436766487764,"rsrp":-111.35743633090178,"distance":4446.150760223096,"has_los":false,"terrain_loss":12.281148408844693,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.488738738738846,"lon":30.508681284718374,"rsrp":-111.34421515845688,"distance":4381.406314018714,"has_los":false,"terrain_loss":12.49233263693558,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.488738738738846,"lon":30.512925802948985,"rsrp":-107.61505718007828,"distance":4336.550567328566,"has_los":false,"terrain_loss":8.920598583784175,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.488738738738846,"lon":30.517170321179595,"rsrp":-109.49022182662709,"distance":4312.204214474664,"has_los":false,"terrain_loss":10.881891357971982,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.488738738738846,"lon":30.521414839410205,"rsrp":-111.77967709599963,"distance":4308.714933970048,"has_los":false,"terrain_loss":13.183730197425636,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.488738738738846,"lon":30.525659357640816,"rsrp":-111.46231304093635,"distance":4326.1331934819445,"has_los":false,"terrain_loss":12.804647811399128,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.488738738738846,"lon":30.529903875871426,"rsrp":-111.69436226391944,"distance":4364.208664057134,"has_los":false,"terrain_loss":12.902644592882108,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.488738738738846,"lon":30.534148394102036,"rsrp":-113.31334642244573,"distance":4422.407822464079,"has_los":false,"terrain_loss":14.318970208631495,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.488738738738846,"lon":30.538392912332647,"rsrp":-111.66831194809208,"distance":4499.94993976124,"has_los":false,"terrain_loss":12.408027070880657,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.488738738738846,"lon":30.542637430563257,"rsrp":-109.62056441510825,"distance":4595.856046229943,"has_los":false,"terrain_loss":10.037664432707366,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.488738738738846,"lon":30.546881948793867,"rsrp":-108.30821820600987,"distance":4709.00424264829,"has_los":false,"terrain_loss":8.353249883121759,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.488738738738846,"lon":30.551126467024478,"rsrp":-108.6090074788307,"distance":4838.184983622749,"has_los":false,"terrain_loss":8.240027777275397,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.488738738738846,"lon":30.555370985255088,"rsrp":-109.78251753381224,"distance":4982.151315351751,"has_los":false,"terrain_loss":8.964968865828293,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.49144144144155,"lon":30.495947730026543,"rsrp":-108.72519243459244,"distance":4912.433379651383,"has_los":false,"terrain_loss":8.123228333229164,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.49144144144155,"lon":30.500192248257154,"rsrp":-109.16221059455643,"distance":4816.591128032016,"has_los":false,"terrain_loss":8.861661791181405,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.49144144144155,"lon":30.504436766487764,"rsrp":-110.8883426355532,"distance":4737.886974384945,"has_los":false,"terrain_loss":10.839830678978572,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.49144144144155,"lon":30.508681284718374,"rsrp":-110.30981742188746,"distance":4677.186159882623,"has_los":false,"terrain_loss":10.458566073976918,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.49144144144155,"lon":30.512925802948985,"rsrp":-109.75852588276643,"distance":4635.19603392949,"has_los":false,"terrain_loss":10.04523443125975,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.49144144144155,"lon":30.517170321179595,"rsrp":-110.80105195597214,"distance":4612.4276340770375,"has_los":false,"terrain_loss":11.16309029679077,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.49144144144155,"lon":30.521414839410205,"rsrp":-112.30021914566474,"distance":4609.165824182339,"has_los":false,"terrain_loss":12.67307970310087,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.49144144144155,"lon":30.525659357640816,"rsrp":-110.13665531824493,"distance":4625.451871838333,"has_los":false,"terrain_loss":10.455557264700376,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.49144144144155,"lon":30.529903875871426,"rsrp":-110.12265500567779,"distance":4661.080877945946,"has_los":false,"terrain_loss":10.32417109524934,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.49144144144155,"lon":30.534148394102036,"rsrp":-110.74604343471864,"distance":4715.61442337179,"has_los":false,"terrain_loss":10.769615930569904,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.49144144144155,"lon":30.538392912332647,"rsrp":-110.09093416949145,"distance":4788.406659265628,"has_los":false,"terrain_loss":9.880164903130499,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.49144144144155,"lon":30.542637430563257,"rsrp":-109.57286289912237,"distance":4878.640362053275,"has_los":false,"terrain_loss":9.076498309007786,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.49144144144155,"lon":30.546881948793867,"rsrp":-108.71112345593454,"distance":4985.3685651448595,"has_los":false,"terrain_loss":7.88369923966448,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.49414414414426,"lon":30.508681284718374,"rsrp":-110.3466113664026,"distance":4973.535182196495,"has_los":false,"terrain_loss":9.555541896521545,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.49414414414426,"lon":30.512925802948985,"rsrp":-108.41809308224246,"distance":4934.069970335691,"has_los":false,"terrain_loss":7.748897755653093,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.49414414414426,"lon":30.517170321179595,"rsrp":-109.0621448083592,"distance":4912.6881563385805,"has_los":false,"terrain_loss":8.459387319620172,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.49414414414426,"lon":30.521414839410205,"rsrp":-112.07408250292198,"distance":4909.62600989286,"has_los":false,"terrain_loss":11.480863417469923,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.49414414414426,"lon":30.525659357640816,"rsrp":-111.755453156487,"distance":4924.91770276702,"has_los":false,"terrain_loss":11.114660556939663,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0},{"lat":50.49414414414426,"lon":30.529903875871426,"rsrp":-113.61420523720636,"distance":4958.393428014046,"has_los":false,"terrain_loss":12.869780914670404,"building_loss":0.0,"reflection_gain":0.0,"vegetation_loss":0.0,"rain_loss":0.0,"indoor_loss":0.0,"atmospheric_loss":0.0}],"count":774,"settings":{"radius":5000.0,"resolution":300.0,"min_signal":-120.0,"use_terrain":true,"use_buildings":true,"use_materials":true,"use_dominant_path":false,"use_street_canyon":false,"use_reflections":false,"use_water_reflection":false,"use_vegetation":false,"season":"summer","rain_rate":0.0,"indoor_loss_type":"none","use_atmospheric":false,"temperature_c":15.0,"humidity_percent":50.0,"preset":"standard"},"stats":{"min_rsrp":-119.9220053482786,"max_rsrp":-46.354920082196855,"avg_rsrp":-104.97198519271623,"los_percentage":16.27906976744186,"points_with_buildings":0,"points_with_terrain_loss":648,"points_with_reflection_gain":0,"points_with_vegetation_loss":0,"points_with_rain_loss":0,"points_with_indoor_loss":0,"points_with_atmospheric_loss":0},"computation_time":38.51,"models_used":["okumura_hata","terrain_los","buildings","materials"]} \ No newline at end of file diff --git a/installer/monitor-realtime.bat b/installer/monitor-realtime.bat new file mode 100644 index 0000000..e54a4b1 --- /dev/null +++ b/installer/monitor-realtime.bat @@ -0,0 +1,49 @@ +@echo off +title RFCP Real-time Resource Monitor +setlocal EnableDelayedExpansion + +echo ============================================ +echo RFCP Real-time Resource Monitor +echo ============================================ +echo Press Ctrl+C to stop +echo ============================================ +echo. +echo TIME CPU%% MEM(MB) PROCS FREE_RAM(MB) +echo ---------- ----- ------- ----- ------------ + +:loop + +:: Get current time +set T=%time:~0,8% + +:: Count RFCP processes and their memory +set PROC_COUNT=0 +set TOTAL_MEM=0 +for /f "skip=3 tokens=5 delims= " %%m in ('tasklist /FI "IMAGENAME eq rfcp-server.exe" 2^>nul') do ( + set /a PROC_COUNT+=1 + set MEM_STR=%%m + set MEM_STR=!MEM_STR:,=! + set MEM_STR=!MEM_STR: =! + if "!MEM_STR!" NEQ "" ( + set /a TOTAL_MEM+=!MEM_STR! 2>nul + ) +) +set /a TOTAL_MEM_MB=TOTAL_MEM/1024 2>nul + +:: Get free RAM (PowerShell β€” wmic deprecated in Win11) +for /f %%a in ('powershell -NoProfile -Command "(Get-CimInstance Win32_OperatingSystem).FreePhysicalMemory" 2^>nul') do ( + set /a FREE_RAM=%%a/1024 2>nul +) + +:: Get CPU load (PowerShell β€” wmic deprecated in Win11) +for /f %%a in ('powershell -NoProfile -Command "(Get-CimInstance Win32_Processor).LoadPercentage" 2^>nul') do ( + set CPU=%%a +) + +:: Display +echo %T% %CPU%%% %TOTAL_MEM_MB% %PROC_COUNT% %FREE_RAM% + +:: Wait 2 seconds +timeout /t 2 /nobreak >nul + +goto loop diff --git a/installer/rfcp-debug-enhanced.bat b/installer/rfcp-debug-enhanced.bat new file mode 100644 index 0000000..8fb8281 --- /dev/null +++ b/installer/rfcp-debug-enhanced.bat @@ -0,0 +1,93 @@ +@echo off +title RFCP Debug Launcher + Monitor +setlocal EnableDelayedExpansion + +echo ============================================ +echo RFCP Debug Launcher + Monitor +echo ============================================ +echo. + +:: Kill any running instance +echo [1/3] Cleaning up existing processes... +taskkill /F /IM rfcp-server.exe 2>nul +if %ERRORLEVEL% EQU 0 ( + echo Killed existing rfcp-server.exe + timeout /t 2 /nobreak >nul +) else ( + echo No existing process found +) +echo. + +:: Environment setup +set PYTHONUNBUFFERED=1 +set RFCP_DEBUG=1 +set RFCP_HOST=127.0.0.1 +set RFCP_PORT=8888 + +echo [2/3] Environment: +echo PYTHONUNBUFFERED=%PYTHONUNBUFFERED% +echo RFCP_DEBUG=%RFCP_DEBUG% +echo RFCP_HOST=%RFCP_HOST% +echo RFCP_PORT=%RFCP_PORT% +echo. + +:: Find executable +if exist "%~dp0dist\rfcp-server.exe" ( + set EXE_PATH=%~dp0dist\rfcp-server.exe + set WORK_DIR=%~dp0dist +) else if exist "%~dp0rfcp-server.exe" ( + set EXE_PATH=%~dp0rfcp-server.exe + set WORK_DIR=%~dp0 +) else ( + echo [ERROR] rfcp-server.exe not found! + pause + exit /b 1 +) + +echo [3/3] Starting server... +echo Executable: %EXE_PATH% +echo Working dir: %WORK_DIR% +echo. + +:: Create log directory +set LOG_DIR=%WORK_DIR%\logs +if not exist "%LOG_DIR%" mkdir "%LOG_DIR%" + +:: Log file with timestamp +set TIMESTAMP=%date:~-4%%date:~3,2%%date:~0,2%-%time:~0,2%%time:~3,2%%time:~6,2% +set TIMESTAMP=%TIMESTAMP: =0% +set LOG_FILE=%LOG_DIR%\server-%TIMESTAMP%.log + +echo Log file: %LOG_FILE% +echo. +echo ============================================ +echo SERVER OUTPUT (also saved to log) +echo ============================================ +echo. + +cd /d "%WORK_DIR%" + +:: Run server and tee to log file +:: Note: PowerShell tee for dual output +powershell -Command "& '%EXE_PATH%' 2>&1 | Tee-Object -FilePath '%LOG_FILE%'" + +echo. +echo ============================================ +echo Server stopped +echo Log saved to: %LOG_FILE% +echo ============================================ + +:: Post-mortem check +echo. +echo [POST-MORTEM] Checking for orphan processes... +for /f %%a in ('tasklist /FI "IMAGENAME eq rfcp-server.exe" 2^>nul ^| find /c "rfcp-server"') do ( + if %%a GTR 0 ( + echo WARNING: %%a rfcp-server process(es) still running! + echo Run: taskkill /F /IM rfcp-server.exe + ) else ( + echo All processes cleaned up properly. + ) +) + +echo. +pause diff --git a/installer/test-coverage-monitor.bat b/installer/test-coverage-monitor.bat new file mode 100644 index 0000000..cf03018 --- /dev/null +++ b/installer/test-coverage-monitor.bat @@ -0,0 +1,282 @@ +@echo off +title RFCP Coverage API Test + Resource Monitor +setlocal EnableDelayedExpansion + +echo ============================================ +echo RFCP Coverage API Test + Resource Monitor +echo ============================================ +echo. + +set API=http://127.0.0.1:8888 +set RESULTS_DIR=%~dp0test-results +set TIMESTAMP=%date:~-4%%date:~3,2%%date:~0,2%-%time:~0,2%%time:~3,2% +set TIMESTAMP=%TIMESTAMP: =0% + +:: Create results directory +if not exist "%RESULTS_DIR%" mkdir "%RESULTS_DIR%" + +:: Log file for this run +set LOG_FILE=%RESULTS_DIR%\test-run-%TIMESTAMP%.log + +echo Test started: %date% %time% > "%LOG_FILE%" +echo. >> "%LOG_FILE%" + +:: =========================================== +:: SYSTEM INFO +:: =========================================== +echo [SYSTEM] Collecting system info... +echo. >> "%LOG_FILE%" +echo === SYSTEM INFO === >> "%LOG_FILE%" + +:: CPU info (PowerShell β€” wmic deprecated in Win11) +for /f "delims=" %%a in ('powershell -NoProfile -Command "(Get-CimInstance Win32_Processor).Name"') do ( + echo CPU: %%a >> "%LOG_FILE%" + echo CPU: %%a +) + +:: RAM info (PowerShell) +for /f %%a in ('powershell -NoProfile -Command "(Get-CimInstance Win32_OperatingSystem).TotalVisibleMemorySize"') do ( + set /a RAM_GB=%%a/1024/1024 + echo RAM: !RAM_GB! GB >> "%LOG_FILE%" + echo RAM: !RAM_GB! GB +) + +:: GPU info (PowerShell) +echo GPU: >> "%LOG_FILE%" +for /f "delims=" %%a in ('powershell -NoProfile -Command "(Get-CimInstance Win32_VideoController).Name"') do ( + echo %%a >> "%LOG_FILE%" + echo %%a +) + +echo. >> "%LOG_FILE%" +echo. + +:: =========================================== +:: PRE-TEST BASELINE +:: =========================================== +echo [BASELINE] Capturing baseline resource usage... + +:: Get baseline memory +for /f %%a in ('powershell -NoProfile -Command "(Get-CimInstance Win32_OperatingSystem).FreePhysicalMemory"') do ( + set /a BASELINE_FREE_MB=%%a/1024 +) +echo Free RAM before: %BASELINE_FREE_MB% MB +echo Baseline free RAM: %BASELINE_FREE_MB% MB >> "%LOG_FILE%" + +:: Count rfcp processes +set RFCP_COUNT=0 +for /f %%a in ('tasklist /FI "IMAGENAME eq rfcp-server.exe" 2^>nul ^| find /c "rfcp-server"') do set RFCP_COUNT=%%a +echo RFCP processes: %RFCP_COUNT% +echo Baseline RFCP processes: %RFCP_COUNT% >> "%LOG_FILE%" +echo. >> "%LOG_FILE%" + +:: =========================================== +:: TEST 1: Health check +:: =========================================== +echo. +echo [TEST 1] Health check... +echo === TEST 1: Health Check === >> "%LOG_FILE%" + +curl -s -o nul -w "HTTP %%{http_code}\n" %API%/api/health +curl -s -w "HTTP %%{http_code}" %API%/api/health >> "%LOG_FILE%" +echo. >> "%LOG_FILE%" + +:: =========================================== +:: TEST 2: System info +:: =========================================== +echo. +echo [TEST 2] Backend system info: +echo === TEST 2: Backend System Info === >> "%LOG_FILE%" + +curl -s %API%/api/system/info +curl -s %API%/api/system/info >> "%LOG_FILE%" +echo. +echo. >> "%LOG_FILE%" + +:: =========================================== +:: TEST 3: Fast preset +:: =========================================== +echo. +echo [TEST 3] Coverage - Fast preset (2km, 500m res) +echo Expected: ^< 1 second +echo === TEST 3: Fast Preset === >> "%LOG_FILE%" + +:: Capture start memory +for /f %%a in ('powershell -NoProfile -Command "(Get-CimInstance Win32_OperatingSystem).FreePhysicalMemory"') do set /a START_FREE=%%a/1024 + +set START_TIME=%time% +curl -s -w "\nTime: %%{time_total}s | HTTP: %%{http_code}" ^ + -X POST %API%/api/coverage/calculate ^ + -H "Content-Type: application/json" ^ + -d "{\"sites\": [{\"lat\": 50.45, \"lon\": 30.52, \"height\": 30, \"power\": 43, \"gain\": 15, \"frequency\": 1800}], \"settings\": {\"radius\": 2000, \"resolution\": 500, \"preset\": \"fast\"}}" ^ + -o "%RESULTS_DIR%\coverage-fast.json" + +set END_TIME=%time% + +:: Capture end memory +for /f %%a in ('powershell -NoProfile -Command "(Get-CimInstance Win32_OperatingSystem).FreePhysicalMemory"') do set /a END_FREE=%%a/1024 +set /a MEM_USED=START_FREE-END_FREE + +echo. +echo Memory delta: %MEM_USED% MB +echo Time: %START_TIME% - %END_TIME% >> "%LOG_FILE%" +echo Memory delta: %MEM_USED% MB >> "%LOG_FILE%" +echo. >> "%LOG_FILE%" + +:: =========================================== +:: TEST 4: Standard preset +:: =========================================== +echo. +echo [TEST 4] Coverage - Standard preset (5km, 300m res) +echo Expected: 30-45 seconds +echo === TEST 4: Standard Preset === >> "%LOG_FILE%" + +:: Monitor resources during test +echo Starting resource monitor... +start /b cmd /c "for /l %%i in (1,1,120) do (for /f %%a in ('powershell -NoProfile -Command "(Get-CimInstance Win32_OperatingSystem).FreePhysicalMemory" 2^>nul') do echo [%%i] Free: %%a KB >> "%RESULTS_DIR%\monitor-standard.log") & timeout /t 1 /nobreak >nul 2>&1" + +for /f %%a in ('powershell -NoProfile -Command "(Get-CimInstance Win32_OperatingSystem).FreePhysicalMemory"') do set /a START_FREE=%%a/1024 + +curl -s -w "\nTime: %%{time_total}s | HTTP: %%{http_code}" ^ + -X POST %API%/api/coverage/calculate ^ + -H "Content-Type: application/json" ^ + -d "{\"sites\": [{\"lat\": 50.45, \"lon\": 30.52, \"height\": 30, \"power\": 43, \"gain\": 15, \"frequency\": 1800}], \"settings\": {\"radius\": 5000, \"resolution\": 300, \"preset\": \"standard\"}}" ^ + -o "%RESULTS_DIR%\coverage-standard.json" + +for /f %%a in ('powershell -NoProfile -Command "(Get-CimInstance Win32_OperatingSystem).FreePhysicalMemory"') do set /a END_FREE=%%a/1024 +set /a MEM_USED=START_FREE-END_FREE +set /a PEAK_FROM_BASELINE=BASELINE_FREE_MB-END_FREE + +echo. +echo Memory delta: %MEM_USED% MB (peak from baseline: %PEAK_FROM_BASELINE% MB) +echo Memory delta: %MEM_USED% MB >> "%LOG_FILE%" + +:: Count RFCP processes +for /f %%a in ('tasklist /FI "IMAGENAME eq rfcp-server.exe" 2^>nul ^| find /c "rfcp-server"') do set RFCP_COUNT=%%a +echo RFCP processes: %RFCP_COUNT% +echo RFCP processes: %RFCP_COUNT% >> "%LOG_FILE%" +echo. >> "%LOG_FILE%" + +:: =========================================== +:: TEST 5: Detailed preset (the big one!) +:: =========================================== +echo. +echo [TEST 5] Coverage - Detailed preset (5km, 300m res) +echo Expected: ^< 90 seconds (was 300s timeout) +echo THIS IS THE VECTORIZATION TEST! +echo === TEST 5: Detailed Preset (VECTORIZATION TEST) === >> "%LOG_FILE%" + +:: Start intensive resource monitor +echo Starting intensive resource monitor (every 2s)... +start /b cmd /c "for /l %%i in (1,1,180) do (for /f %%a in ('powershell -NoProfile -Command "(Get-CimInstance Win32_OperatingSystem).FreePhysicalMemory" 2^>nul') do echo [%%i] Free: %%a KB >> "%RESULTS_DIR%\monitor-detailed.log") & timeout /t 2 /nobreak >nul 2>&1" + +:: CPU monitor (approximate via tasklist) +start /b cmd /c "for /l %%i in (1,1,180) do (for /f "skip=2 tokens=5" %%c in ('tasklist /FI "IMAGENAME eq rfcp-server.exe" /FO LIST 2^>nul ^| findstr "Mem"') do echo [%%i] RFCP Mem: %%c >> "%RESULTS_DIR%\monitor-rfcp.log") & timeout /t 2 /nobreak >nul 2>&1" + +for /f %%a in ('powershell -NoProfile -Command "(Get-CimInstance Win32_OperatingSystem).FreePhysicalMemory"') do set /a START_FREE=%%a/1024 + +set START_DETAIL=%time% +echo Start time: %START_DETAIL% + +curl -s -w "\nTime: %%{time_total}s | HTTP: %%{http_code}" ^ + -X POST %API%/api/coverage/calculate ^ + -H "Content-Type: application/json" ^ + -d "{\"sites\": [{\"lat\": 50.45, \"lon\": 30.52, \"height\": 30, \"power\": 43, \"gain\": 15, \"frequency\": 1800}], \"settings\": {\"radius\": 5000, \"resolution\": 300, \"preset\": \"detailed\"}}" ^ + -o "%RESULTS_DIR%\coverage-detailed.json" ^ + 2>&1 + +set END_DETAIL=%time% +echo End time: %END_DETAIL% + +for /f %%a in ('powershell -NoProfile -Command "(Get-CimInstance Win32_OperatingSystem).FreePhysicalMemory"') do set /a END_FREE=%%a/1024 +set /a MEM_USED=START_FREE-END_FREE +set /a PEAK_FROM_BASELINE=BASELINE_FREE_MB-END_FREE + +echo. +echo Memory delta: %MEM_USED% MB (peak from baseline: %PEAK_FROM_BASELINE% MB) +echo Start: %START_DETAIL% >> "%LOG_FILE%" +echo End: %END_DETAIL% >> "%LOG_FILE%" +echo Memory delta: %MEM_USED% MB >> "%LOG_FILE%" + +:: Check result +if exist "%RESULTS_DIR%\coverage-detailed.json" ( + findstr /C:"timeout" "%RESULTS_DIR%\coverage-detailed.json" >nul 2>&1 + if !ERRORLEVEL! EQU 0 ( + echo RESULT: TIMEOUT - Vectorization didn't help enough + echo RESULT: TIMEOUT >> "%LOG_FILE%" + ) else ( + findstr /C:"points" "%RESULTS_DIR%\coverage-detailed.json" >nul 2>&1 + if !ERRORLEVEL! EQU 0 ( + echo RESULT: SUCCESS - Calculation completed! + echo RESULT: SUCCESS >> "%LOG_FILE%" + + :: Extract point count + for /f "tokens=2 delims=:" %%a in ('findstr /C:"count" "%RESULTS_DIR%\coverage-detailed.json"') do ( + echo Points calculated: %%a + echo Points: %%a >> "%LOG_FILE%" + ) + ) else ( + echo RESULT: ERROR - Check JSON file + echo RESULT: ERROR >> "%LOG_FILE%" + ) + ) +) + +:: =========================================== +:: POST-TEST CLEANUP CHECK +:: =========================================== +echo. +echo [CLEANUP] Checking post-test state... +echo === POST-TEST CLEANUP === >> "%LOG_FILE%" + +timeout /t 3 /nobreak >nul + +:: Count RFCP processes +for /f %%a in ('tasklist /FI "IMAGENAME eq rfcp-server.exe" 2^>nul ^| find /c "rfcp-server"') do set RFCP_COUNT=%%a +echo RFCP processes after test: %RFCP_COUNT% +echo RFCP processes after: %RFCP_COUNT% >> "%LOG_FILE%" + +:: Memory recovery +for /f %%a in ('powershell -NoProfile -Command "(Get-CimInstance Win32_OperatingSystem).FreePhysicalMemory"') do set /a FINAL_FREE=%%a/1024 +set /a MEM_NOT_FREED=BASELINE_FREE_MB-FINAL_FREE + +echo Free RAM now: %FINAL_FREE% MB (baseline was: %BASELINE_FREE_MB% MB) +echo Memory not freed: %MEM_NOT_FREED% MB +echo Final free RAM: %FINAL_FREE% MB >> "%LOG_FILE%" +echo Memory not freed: %MEM_NOT_FREED% MB >> "%LOG_FILE%" + +if %MEM_NOT_FREED% GTR 500 ( + echo WARNING: Possible memory leak - %MEM_NOT_FREED% MB not freed! + echo WARNING: Memory leak detected >> "%LOG_FILE%" +) + +if %RFCP_COUNT% GTR 1 ( + echo WARNING: Multiple RFCP processes still running! + echo WARNING: Multiple processes >> "%LOG_FILE%" +) + +:: =========================================== +:: SUMMARY +:: =========================================== +echo. +echo ============================================ +echo TEST SUMMARY +echo ============================================ +echo. +echo Results saved to: %RESULTS_DIR% +echo Log file: %LOG_FILE% +echo. +echo Files created: +echo - coverage-fast.json +echo - coverage-standard.json +echo - coverage-detailed.json +echo - monitor-standard.log (memory during standard) +echo - monitor-detailed.log (memory during detailed) +echo - monitor-rfcp.log (rfcp process memory) +echo. + +echo === SUMMARY === >> "%LOG_FILE%" +echo Test completed: %date% %time% >> "%LOG_FILE%" + +echo ============================================ +pause diff --git a/installer/test-detailed-quick.bat b/installer/test-detailed-quick.bat new file mode 100644 index 0000000..9a6b976 --- /dev/null +++ b/installer/test-detailed-quick.bat @@ -0,0 +1,128 @@ +@echo off +title RFCP - Detailed Preset Quick Test +setlocal EnableDelayedExpansion + +echo ============================================ +echo RFCP - Detailed Preset Quick Test +echo ============================================ +echo. +echo This tests ONLY the Detailed preset to check +echo if NumPy vectorization is working. +echo. +echo Expected: ^< 90 seconds (was 300s timeout) +echo ============================================ +echo. + +set API=http://127.0.0.1:8888 + +:: Check if server is running +echo [1/4] Checking server... +curl -s -o nul -w "HTTP %%{http_code}" %API%/api/health >nul 2>&1 +if %ERRORLEVEL% NEQ 0 ( + echo ERROR: Server not responding! Start rfcp-debug.bat first. + pause + exit /b 1 +) +echo Server OK +echo. + +:: Get baseline +echo [2/4] Capturing baseline... +for /f %%a in ('powershell -NoProfile -Command "(Get-CimInstance Win32_OperatingSystem).FreePhysicalMemory"') do set /a BASE_FREE=%%a/1024 +for /f %%a in ('tasklist /FI "IMAGENAME eq rfcp-server.exe" 2^>nul ^| find /c "rfcp-server"') do set BASE_PROCS=%%a +echo Free RAM: %BASE_FREE% MB +echo RFCP procs: %BASE_PROCS% +echo. + +:: Run test +echo [3/4] Running Detailed preset (5km, 300m)... +echo Start: %time% +echo. + +curl -s -w "\n HTTP: %%{http_code}\n Time: %%{time_total} seconds\n" ^ + -X POST %API%/api/coverage/calculate ^ + -H "Content-Type: application/json" ^ + -d "{\"sites\": [{\"lat\": 50.45, \"lon\": 30.52, \"height\": 30, \"power\": 43, \"gain\": 15, \"frequency\": 1800}], \"settings\": {\"radius\": 5000, \"resolution\": 300, \"preset\": \"detailed\"}}" ^ + -o detailed-result.json + +echo. +echo End: %time% +echo. + +:: Check result +echo [4/4] Analyzing result... + +:: Check for timeout +findstr /C:"timeout" detailed-result.json >nul 2>&1 +if %ERRORLEVEL% EQU 0 ( + echo. + echo ============================================ + echo RESULT: TIMEOUT + echo Vectorization needs more optimization. + echo ============================================ + echo. + type detailed-result.json + goto :cleanup +) + +:: Check for success (has "points") +findstr /C:"\"points\"" detailed-result.json >nul 2>&1 +if %ERRORLEVEL% EQU 0 ( + echo. + echo ============================================ + echo RESULT: SUCCESS! + echo Detailed preset completed without timeout! + echo ============================================ + echo. + + :: Extract stats + echo Extracting stats from result... + + :: Count points (rough) + for /f "tokens=2 delims=:," %%a in ('findstr /C:"\"count\"" detailed-result.json') do ( + echo Points calculated: %%a + ) + + :: Get computation time + for /f "tokens=2 delims=:," %%a in ('findstr /C:"\"computation_time\"" detailed-result.json') do ( + echo Computation time: %%a seconds + ) + + goto :cleanup +) + +:: Unknown result +echo. +echo RESULT: UNKNOWN +echo Check detailed-result.json manually +type detailed-result.json + +:cleanup +echo. +echo ============================================ +echo POST-TEST CLEANUP CHECK +echo ============================================ + +timeout /t 3 /nobreak >nul + +for /f %%a in ('powershell -NoProfile -Command "(Get-CimInstance Win32_OperatingSystem).FreePhysicalMemory"') do set /a END_FREE=%%a/1024 +for /f %%a in ('tasklist /FI "IMAGENAME eq rfcp-server.exe" 2^>nul ^| find /c "rfcp-server"') do set END_PROCS=%%a + +set /a MEM_DIFF=BASE_FREE-END_FREE + +echo Free RAM: %END_FREE% MB (was %BASE_FREE% MB, diff: %MEM_DIFF% MB) +echo RFCP procs: %END_PROCS% (was %BASE_PROCS%) + +if %MEM_DIFF% GTR 500 ( + echo. + echo WARNING: Memory not fully released! +) + +if %END_PROCS% GTR %BASE_PROCS% ( + echo. + echo WARNING: Extra RFCP processes still running! +) + +echo. +echo ============================================ +pause