Visibility
Overview
The Visibility module provides tools to analyze line-of-sight connectivity between different infrastructure components. It determines whether points of interest (POIs) have clear line-of-sight with cell sites or with other POIs, accounting for terrain elevation, Earth's curvature, and antenna heights. Line-of-sight is required to establish the feasibility of radio links between points of interest (POIs) and cell sites using visibility analysis. The analysis uses open topography data from the Shuttle Radar Topography Mission (SRTM), which provides 30-meter resolution elevation data.
Figure: Visible cell site

Figure: Obstructed cell site

Key Features:
- Line-of-sight analysis between points considering terrain elevation (SRTM data)
- Earth curvature and atmospheric refraction modeling
- Configurable search radius and antenna heights
- Support for different cellular radio types (2G, 3G, 4G, 5G)
- Detailed results including visibility status, distances, and azimuth angles
Base Class: Visibility
The Visibility
class serves as the foundation for visibility analyses.
Class Parameters
Parameter |
Type |
Default |
Description |
points_of_interest |
PointOfInterestCollection |
Required |
Collection of points of interest |
cell_sites |
CellSiteCollection |
None |
Collection of cell sites |
srtm_data_handler |
SRTMDataHandler |
None |
Handler for SRTM elevation data |
search_radius |
int |
35 |
Maximum distance (km) to search for visibility |
num_visible |
int |
3 |
Number of visible sites/POIs to find |
poi_antenna_height |
float |
15 |
Antenna height at POI locations (meters) |
allowed_radio_types |
list |
['unknown', '2G', '3G', '4G', '5G'] |
Radio types to include |
earth_radius |
float |
6371 |
Earth radius in kilometers |
refraction_coef |
float |
0 |
Atmospheric refraction coefficient |
use_srtm |
bool |
True |
Whether to use SRTM elevation data |
logger |
Logger |
None |
Logger instance |
Class Attributes
Attribute |
Type |
Description |
points_of_interest |
PointOfInterestCollection |
Collection of points of interest |
cell_sites |
CellSiteCollection |
Collection of cell sites |
srtm_data_handler |
SRTMDataHandler |
Handler for SRTM elevation data |
search_radius |
int |
Maximum search distance in meters |
analysis_param |
dict |
Parameters used for the analysis |
analysis_stats |
dict |
Statistics about the analysis run |
logger |
Logger |
Logger instance for the class |
Methods
Method |
Return Type |
Description |
retrieve_srtm_data_files() |
None |
Downloads required SRTM elevation data |
get_antenna_height(point) |
float |
Gets antenna height for a point |
check_visibility(source, target, use_srtm, srtm_collection, search_radius) |
tuple |
Determines if target is visible from source considering terrain |
VisibilityCell: Cell Sites Visible from POIs
Class Attributes
Attribute |
Type |
Description |
analysis_results |
dict |
Dictionary storing analysis results per POI |
analysis_stats |
dict |
Statistics about the analysis run |
analysis_param |
dict |
Parameters used for the analysis |
Methods
Method |
Return Type |
Description |
perform_analysis() |
None |
Executes visibility analysis, finding visible cell sites for each POI |
get_results_table() |
DataFrame |
Returns formatted results with detailed visibility information |
get_storage_table() |
DataFrame |
Returns raw analysis results as a DataFrame |
format_analysis_summary() |
str |
Returns a human-readable summary of analysis statistics |
retrieve_srtm_data_files() |
None |
Downloads required SRTM elevation data |
check_visibility() |
tuple |
Determines if target is visible from source considering terrain |
VisibilityPOI: Points of Interest Visible to Each Other
Class Attributes
Attribute |
Type |
Description |
analysis_results |
DataFrame |
DataFrame storing source-target pairs with visibility status |
Methods
Method |
Return Type |
Description |
perform_analysis() |
None |
Computes visibility between all pairs of POIs |
get_results_table() |
DataFrame |
Returns a symmetrically formatted visibility graph |
retrieve_srtm_data_files() |
None |
Downloads required SRTM elevation data |
check_visibility() |
tuple |
Determines if target is visible from source considering terrain |
Example
import pandas as pd
from giga_inframapkit.entities.pointofinterest import PointOfInterestCollection
from giga_inframapkit.entities.cellsite import CellSiteCollection
from giga_inframapkit.handlers.srtmdatahandler import SRTMDataHandler
from giga_inframapkit.visibility.visibility import VisibilityCell, VisibilityPOI
# 1. Set up your data collections
poi_df = pd.read_csv("input/points_of_interest.csv")
poi_collection = PointOfInterestCollection()
poi_collection.load_from_records(poi_df.to_dict('records'))
# PointOfInterestCollection: 104 entities
cell_site_df = pd.read_csv("input/cell_sites.csv")
cell_site_collection = CellSiteCollection()
cell_site_collection.load_from_records(cell_site_df.to_dict('records'))
# CellSiteCollection: 34 entities
# 2. Set up the elevation data handler, that downloads a raster file with elevation data into the data_dir
srtm_data_handler = SRTMDataHandler(srtm_directory=f'/input/srtm1', logger=None)
# 3. Perform POI to cell site visibility
visibility_cellsites = VisibilityCell(
points_of_interest=poi_collection,
cell_sites=cell_site_collection,
srtm_data_handler=srtm_data_handler,
search_radius=35,
num_visible=3,
poi_antenna_height=25,
allowed_radio_types=["4G", "5G"],
earth_radius=6371,
refraction_coef=0,
logger=None
)
visibility_cellsites.perform_analysis()
# INFO:visibility_STP:Locating SRTM data files...
# INFO:visibility_STP:0 data file(s) to download.
# INFO:visibility_STP:Downloading SRTM data files...
# INFO:visibility_STP:Fetching from ITU public storage
# INFO:visibility_STP:Filelist specified, downloading only selected files
# INFO:visibility_STP:Downloaded completed
# INFO:visibility_STP:Using 8 processes for parallel computation
# INFO:visibility_STP:Processing 104 points of interest
# INFO:visibility_STP:Checking cell site visibility: 0%| | 0/104 [00:00<?, ?it/s]
# INFO:visibility_STP:Checking cell site visibility: 1%| | 1/104 [00:02<03:46, 2.20s/it]
# INFO:visibility_STP:Checking cell site visibility: 18%|#8 | 19/104 [00:02<00:08, 9.85it/s]
# INFO:visibility_STP:Checking cell site visibility: 36%|###5 | 37/104 [00:02<00:03, 19.56it/s]
# INFO:visibility_STP:Checking cell site visibility: 100%|##########| 104/104 [00:02<00:00, 35.79it/s]
# Visibility Analysis Summary:
# Number of points of interest: 104
# Number of cell sites: 34
# Total visibility checks performed: 1803
# Average visibility checks per point of interest: 17.34
# Time taken for SRTM data download: 0.11 seconds
# Time taken for analysis: 3.0 seconds
# Total time elapsed: 3.11 seconds
cellsites_results_table = visibility_cellsites.get_results_table()
cellsites_results_table.head()
# poi_id ict_id radio_type ground_distance antenna_los_distance azimuth_angle geometry is_visible num_visible order
# 0 be6dc17a-57df-4709-bff1-18f433f7df71 4381fb37-07f8-465a-a654-6bc8df169be0 4G 269 269 211.41 LINESTRING (6.7332108 0.3300316, 6.73195 0.327... True 3 1
# 1 be6dc17a-57df-4709-bff1-18f433f7df71 7c4d5ac9-c381-485e-9c3f-99fbb062c837 4G 815 815 353.02 LINESTRING (6.7332108 0.3300316, 6.732319444 0... True 3 2
# 2 be6dc17a-57df-4709-bff1-18f433f7df71 cb6229b5-b934-4d5f-a7c1-39f33e1b1d6f 4G 881 881 77.87 LINESTRING (6.7332108 0.3300316, 6.740961111 0... True 3 3
# 3 7f4bf645-3665-4658-9913-edcb3fba3b2d 226b6f88-aac8-41af-8c88-6fd30b561afa 4G 683 683 21.55 LINESTRING (6.7235979 0.3330804, 6.725855556 0... True 3 1
# 4 7f4bf645-3665-4658-9913-edcb3fba3b2d b4fbe775-c7e9-4752-b21c-883b84ea08ad 4G 867 869 257.62 LINESTRING (6.7235979 0.3330804, 6.715980556 0... True 3 2
# 4. Perform POI to POI visibility
visibility_pois = VisibilityPOI(
points_of_interest=poi_collection,
cell_sites=cell_site_collection,
srtm_data_handler = srtm_data_handler,
search_radius = 35,
poi_antenna_height = 25,
earth_radius = 6371,
refraction_coef = 0,
logger = None
)
visibility_pois.perform_analysis()
# INFO:visibility_STP:Locating SRTM data files...
# INFO:visibility_STP:0 data file(s) to download.
# INFO:visibility_STP:Downloading SRTM data files...
# INFO:visibility_STP:Fetching from ITU public storage
# INFO:visibility_STP:Filelist specified, downloading only selected files
# INFO:visibility_STP:Downloaded completed
# INFO:visibility_STP:Using 8 processes for parallel computation
# INFO:visibility_STP:Processing 5356 POI pairs
# INFO:visibility_STP:Checking POI-to-POI visibility: 0%| | 0/5356 [00:00<?, ?it/s]
# INFO:visibility_STP:Checking POI-to-POI visibility: 0%| | 1/5356 [00:03<4:55:26, 3.31s/it]
# INFO:visibility_STP:Checking POI-to-POI visibility: 6%|6 | 335/5356 [00:03<00:37, 135.50it/s]
# INFO:visibility_STP:Checking POI-to-POI visibility: 19%|#8 | 1003/5356 [00:03<00:10, 417.91it/s]
# INFO:visibility_STP:Checking POI-to-POI visibility: 50%|####9 | 2673/5356 [00:05<00:03, 842.69it/s]
# INFO:visibility_STP:Checking POI-to-POI visibility: 56%|#####6 | 3007/5356 [00:05<00:02, 903.04it/s]
# INFO:visibility_STP:Checking POI-to-POI visibility: 100%|##########| 5356/5356 [00:05<00:00, 999.95it/s]
# INFO:visibility_STP:Analysis completed in 5.57 seconds
pois_results_table = visibility_pois.get_results_table()
pois_results_table.head()
# poi_id visible_pois is_visible_pois
# 0 09b90515-0ecc-4992-9d39-ae208e1c1fea [1d24a1c9-9d48-4ea0-9aa3-cfdb65d228a1] True
# 1 0c16c2e8-db92-411b-a6f7-535fb1810e34 [967c9f47-5162-4f1b-aaa2-a7d77279d40c, 1e83e05... True
# 2 1205e5ef-5d91-47b7-8fc0-11ef019263e5 [c77898fa-9377-4552-b2a1-c719f3257dbf, 76d2158... True
# 3 1534adf8-b45c-443b-8e1d-87a504e6dc64 [82e467a9-50d8-407f-aa3a-58b68297b55b, 6dda061... True
# 4 192c1704-9e7e-4b7a-8ba7-0eed5ae771ad [26ac2dc1-98e0-4ce7-8c1f-c6935b90ecc4, aeb454b... True