Module losanalyst.tools.extract_horizons
Expand source code
from osgeo import ogr
from gdalhelpers.helpers import datasource_helpers, layer_helpers
from gdalhelpers.checks import layer_checks, datasource_checks
from losanalyst.functions import checks, helpers
import losanalyst.functions.los_field_names as field_names
from losanalyst.classes.los_local import LoSLocal
from losanalyst.classes.los_without_target import LoSWithoutTarget
from losanalyst.classes.los_global import LoSGlobal
def extract_horizons(los_ds: ogr.DataSource,
use_curvature_corrections: bool = True,
refraction_coefficient: float = 0.13) -> ogr.DataSource:
horizons_ds = datasource_helpers.create_temp_gpkg_datasource()
datasource_checks.check_is_ogr_datasource(los_ds, "los_ds")
los_layer = los_ds.GetLayer()
checks.check_los_layer(los_layer)
# check type of the layer
los_global = checks.is_global_los_layer(los_layer)
los_without_target = checks.is_los_without_target(los_layer)
layer_helpers.create_layer_points_25d(horizons_ds, los_layer.GetSpatialRef(), "horizons")
horizons_layer = horizons_ds.GetLayer()
fields_types = {field_names.observer_id_field_name: ogr.OFTInteger,
field_names.target_id_field_name: ogr.OFTInteger}
layer_helpers.add_fields_from_dict(horizons_layer, fields_types)
horizon_feature_defn = horizons_layer.GetLayerDefn()
for feature_los in los_layer:
los_geom = feature_los.GetGeometryRef()
los_points = helpers.wkt_to_list(los_geom.ExportToWkt())
o_offset = feature_los.GetField(field_names.observer_offset_field_name)
t_offset = feature_los.GetField(field_names.target_offset_field_name)
o_id = feature_los.GetField(field_names.observer_id_field_name)
t_id = feature_los.GetField(field_names.target_id_field_name)
if los_without_target:
los = LoSWithoutTarget(los_points,
observer_offset=o_offset,
use_curvature_corrections=use_curvature_corrections,
refraction_coefficient=refraction_coefficient)
elif los_global:
t_x = feature_los.GetField(field_names.tp_x_field_name)
t_y = feature_los.GetField(field_names.tp_y_field_name)
los = LoSGlobal(los_points,
observer_offset=o_offset,
target_offset=t_offset,
target_x=t_x,
target_y=t_y,
use_curvature_corrections=use_curvature_corrections,
refraction_coefficient=refraction_coefficient)
else:
los = LoSLocal(los_points,
observer_offset=o_offset,
target_offset=t_offset,
use_curvature_corrections=use_curvature_corrections,
refraction_coefficient=refraction_coefficient)
geoms = los.get_horizons()
if 0 < len(geoms):
for geom in geoms:
horizon_feature = ogr.Feature(horizon_feature_defn)
horizon_feature.SetGeometry(geom)
fields_values = {field_names.observer_id_field_name: o_id,
field_names.target_id_field_name: t_id}
layer_helpers.add_values_from_dict(horizon_feature, fields_values)
horizons_layer.CreateFeature(horizon_feature)
horizon_feature = None
return horizons_ds
def extract_global_horizon(los_ds: ogr.DataSource,
use_curvature_corrections: bool = True,
refraction_coefficient: float = 0.13) -> ogr.DataSource:
horizons_ds = datasource_helpers.create_temp_gpkg_datasource()
datasource_checks.check_is_ogr_datasource(los_ds, "los_ds")
los_layer = los_ds.GetLayer()
checks.check_los_layer(los_layer)
# check type of the layer
los_global = checks.is_global_los_layer(los_layer)
los_without_target = checks.is_los_without_target(los_layer)
layer_helpers.create_layer_points_25d(horizons_ds, los_layer.GetSpatialRef(), "horizons")
horizons_layer = horizons_ds.GetLayer()
fields_types = {field_names.observer_id_field_name: ogr.OFTInteger,
field_names.target_id_field_name: ogr.OFTInteger}
layer_helpers.add_fields_from_dict(horizons_layer, fields_types)
horizon_feature_defn = horizons_layer.GetLayerDefn()
for feature_los in los_layer:
los_geom = feature_los.GetGeometryRef()
los_points = helpers.wkt_to_list(los_geom.ExportToWkt())
o_offset = feature_los.GetField(field_names.observer_offset_field_name)
t_offset = feature_los.GetField(field_names.target_offset_field_name)
o_id = feature_los.GetField(field_names.observer_id_field_name)
t_id = feature_los.GetField(field_names.target_id_field_name)
if los_without_target:
los = LoSWithoutTarget(los_points,
observer_offset=o_offset,
use_curvature_corrections=use_curvature_corrections,
refraction_coefficient=refraction_coefficient)
elif los_global:
t_x = feature_los.GetField(field_names.tp_x_field_name)
t_y = feature_los.GetField(field_names.tp_y_field_name)
los = LoSGlobal(los_points,
observer_offset=o_offset,
target_offset=t_offset,
target_x=t_x,
target_y=t_y,
use_curvature_corrections=use_curvature_corrections,
refraction_coefficient=refraction_coefficient)
else:
raise ValueError("Cannot get global horizon for local LOS.")
horizon_feature = ogr.Feature(horizon_feature_defn)
geom = los.get_global_horizon()
horizon_feature.SetGeometry(geom)
fields_values = {field_names.observer_id_field_name: o_id,
field_names.target_id_field_name: t_id}
layer_helpers.add_values_from_dict(horizon_feature, fields_values)
horizons_layer.CreateFeature(horizon_feature)
horizon_feature = None
return horizons_ds
Functions
def extract_global_horizon(los_ds, use_curvature_corrections=True, refraction_coefficient=0.13)
-
Expand source code
def extract_global_horizon(los_ds: ogr.DataSource, use_curvature_corrections: bool = True, refraction_coefficient: float = 0.13) -> ogr.DataSource: horizons_ds = datasource_helpers.create_temp_gpkg_datasource() datasource_checks.check_is_ogr_datasource(los_ds, "los_ds") los_layer = los_ds.GetLayer() checks.check_los_layer(los_layer) # check type of the layer los_global = checks.is_global_los_layer(los_layer) los_without_target = checks.is_los_without_target(los_layer) layer_helpers.create_layer_points_25d(horizons_ds, los_layer.GetSpatialRef(), "horizons") horizons_layer = horizons_ds.GetLayer() fields_types = {field_names.observer_id_field_name: ogr.OFTInteger, field_names.target_id_field_name: ogr.OFTInteger} layer_helpers.add_fields_from_dict(horizons_layer, fields_types) horizon_feature_defn = horizons_layer.GetLayerDefn() for feature_los in los_layer: los_geom = feature_los.GetGeometryRef() los_points = helpers.wkt_to_list(los_geom.ExportToWkt()) o_offset = feature_los.GetField(field_names.observer_offset_field_name) t_offset = feature_los.GetField(field_names.target_offset_field_name) o_id = feature_los.GetField(field_names.observer_id_field_name) t_id = feature_los.GetField(field_names.target_id_field_name) if los_without_target: los = LoSWithoutTarget(los_points, observer_offset=o_offset, use_curvature_corrections=use_curvature_corrections, refraction_coefficient=refraction_coefficient) elif los_global: t_x = feature_los.GetField(field_names.tp_x_field_name) t_y = feature_los.GetField(field_names.tp_y_field_name) los = LoSGlobal(los_points, observer_offset=o_offset, target_offset=t_offset, target_x=t_x, target_y=t_y, use_curvature_corrections=use_curvature_corrections, refraction_coefficient=refraction_coefficient) else: raise ValueError("Cannot get global horizon for local LOS.") horizon_feature = ogr.Feature(horizon_feature_defn) geom = los.get_global_horizon() horizon_feature.SetGeometry(geom) fields_values = {field_names.observer_id_field_name: o_id, field_names.target_id_field_name: t_id} layer_helpers.add_values_from_dict(horizon_feature, fields_values) horizons_layer.CreateFeature(horizon_feature) horizon_feature = None return horizons_ds
def extract_horizons(los_ds, use_curvature_corrections=True, refraction_coefficient=0.13)
-
Expand source code
def extract_horizons(los_ds: ogr.DataSource, use_curvature_corrections: bool = True, refraction_coefficient: float = 0.13) -> ogr.DataSource: horizons_ds = datasource_helpers.create_temp_gpkg_datasource() datasource_checks.check_is_ogr_datasource(los_ds, "los_ds") los_layer = los_ds.GetLayer() checks.check_los_layer(los_layer) # check type of the layer los_global = checks.is_global_los_layer(los_layer) los_without_target = checks.is_los_without_target(los_layer) layer_helpers.create_layer_points_25d(horizons_ds, los_layer.GetSpatialRef(), "horizons") horizons_layer = horizons_ds.GetLayer() fields_types = {field_names.observer_id_field_name: ogr.OFTInteger, field_names.target_id_field_name: ogr.OFTInteger} layer_helpers.add_fields_from_dict(horizons_layer, fields_types) horizon_feature_defn = horizons_layer.GetLayerDefn() for feature_los in los_layer: los_geom = feature_los.GetGeometryRef() los_points = helpers.wkt_to_list(los_geom.ExportToWkt()) o_offset = feature_los.GetField(field_names.observer_offset_field_name) t_offset = feature_los.GetField(field_names.target_offset_field_name) o_id = feature_los.GetField(field_names.observer_id_field_name) t_id = feature_los.GetField(field_names.target_id_field_name) if los_without_target: los = LoSWithoutTarget(los_points, observer_offset=o_offset, use_curvature_corrections=use_curvature_corrections, refraction_coefficient=refraction_coefficient) elif los_global: t_x = feature_los.GetField(field_names.tp_x_field_name) t_y = feature_los.GetField(field_names.tp_y_field_name) los = LoSGlobal(los_points, observer_offset=o_offset, target_offset=t_offset, target_x=t_x, target_y=t_y, use_curvature_corrections=use_curvature_corrections, refraction_coefficient=refraction_coefficient) else: los = LoSLocal(los_points, observer_offset=o_offset, target_offset=t_offset, use_curvature_corrections=use_curvature_corrections, refraction_coefficient=refraction_coefficient) geoms = los.get_horizons() if 0 < len(geoms): for geom in geoms: horizon_feature = ogr.Feature(horizon_feature_defn) horizon_feature.SetGeometry(geom) fields_values = {field_names.observer_id_field_name: o_id, field_names.target_id_field_name: t_id} layer_helpers.add_values_from_dict(horizon_feature, fields_values) horizons_layer.CreateFeature(horizon_feature) horizon_feature = None return horizons_ds