/usr/lib/python3/dist-packages/hydroffice/bag/bbox.py is in python3-hydroffice.bag 0.2.15-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 | from __future__ import absolute_import, division, print_function, unicode_literals
import os
import logging
log = logging.getLogger(__name__)
from osgeo import ogr, osr
from .meta import Meta
from .helper import BAGError, Helper
from . import __version__
ogr.UseExceptions()
class Bbox2Gdal(object):
formats = {
'gjs': [b"GeoJSON", "bag.geojson"],
'gml': [b"GML", "bag.gml"],
'kml': [b"KML", "bag.kml"],
'shp': [b"ESRI Shapefile", "bag.shp"],
}
def __init__(self, bag_meta, fmt="kml", title=None, out_file=None):
assert isinstance(bag_meta, Meta)
self.bag_meta = bag_meta
if not self.bag_meta.valid_bbox():
raise BAGError("invalid bbox read in BAG metadata")
self.title = title
if self.title is None:
self.title = "Metadata"
log.debug("title: %s" % self.title)
# get the ogr driver
self.drv = ogr.GetDriverByName(self.formats[fmt][0])
if self.drv is None:
raise BAGError("%s driver not available.\n" % self.formats[fmt][0])
# set the output file
self.out_file = out_file
if self.out_file is None:
self.out_file = os.path.abspath(self.formats[fmt][1])
log.debug("output: %s" % self.out_file)
if os.path.exists(self.out_file):
os.remove(self.out_file)
# create the data source
ds = self.drv.CreateDataSource(self.out_file)
# create the spatial reference (WGS84)
self.srs = osr.SpatialReference()
self.srs.ImportFromEPSG(4326)
# create the layer
self.lyr = ds.CreateLayer(b"BAG", self.srs, ogr.wkbLineString25D)
self._define_layer_fields()
# add feature
self._add_feature()
ds.Destroy()
def _define_layer_fields(self):
# Add the fields we're interested in
self.lyr.CreateField(ogr.FieldDefn(b"Name", ogr.OFTString))
if self.bag_meta.rows is not None:
self.lyr.CreateField(ogr.FieldDefn(b"Rows", ogr.OFTInteger))
if self.bag_meta.cols is not None:
self.lyr.CreateField(ogr.FieldDefn(b"Cols", ogr.OFTInteger))
if self.bag_meta.ne is not None:
self.lyr.CreateField(ogr.FieldDefn(b"NE", ogr.OFTString))
if self.bag_meta.sw is not None:
self.lyr.CreateField(ogr.FieldDefn(b"SW", ogr.OFTString))
if self.bag_meta.res_x is not None:
self.lyr.CreateField(ogr.FieldDefn(b"ResX", ogr.OFTReal))
if self.bag_meta.res_y is not None:
self.lyr.CreateField(ogr.FieldDefn(b"ResY", ogr.OFTReal))
if self.bag_meta.abstract is not None:
self.lyr.CreateField(ogr.FieldDefn(b"Abstract", ogr.OFTString))
if self.bag_meta.date is not None:
self.lyr.CreateField(ogr.FieldDefn(b"Date", ogr.OFTString))
if self.bag_meta.wkt_srs is not None:
self.lyr.CreateField(ogr.FieldDefn(b"SRS", ogr.OFTString))
self.lyr.CreateField(ogr.FieldDefn(b"Tools", ogr.OFTString))
def _add_feature(self):
# create the WKT for the feature using Python string formatting
feature = ogr.Feature(self.lyr.GetLayerDefn())
feature.SetField(b"Name", self.title.encode())
if self.bag_meta.rows is not None:
feature.SetField(b"Rows", self.bag_meta.rows)
if self.bag_meta.cols is not None:
feature.SetField(b"Cols", self.bag_meta.cols)
if self.bag_meta.ne is not None:
feature.SetField(b"NE", ("%s" % self.bag_meta.ne).encode())
if self.bag_meta.sw is not None:
feature.SetField(b"SW", ("%s" % self.bag_meta.sw).encode())
if self.bag_meta.res_x is not None:
feature.SetField(b"ResX", ("%s" % self.bag_meta.res_x).encode())
if self.bag_meta.res_y is not None:
feature.SetField(b"ResY", ("%s" % self.bag_meta.res_y).encode())
if self.bag_meta.abstract is not None:
feature.SetField(b"Abstract", self.bag_meta.abstract)
if self.bag_meta.date is not None:
feature.SetField(b"Date", self.bag_meta.date)
if self.bag_meta.wkt_srs is not None:
feature.SetField(b"SRS", Helper.elide(self.bag_meta.wkt_srs, max_len=60).encode())
feature.SetField(b"Tools", ("r%s" % __version__).encode())
wkt = self.bag_meta.wkt_bbox()
# log.debug("bbox: %s" % wkt)
point = ogr.CreateGeometryFromWkt(wkt)
feature.SetGeometry(point)
self.lyr.CreateFeature(feature)
feature.Destroy()
|