Loading autocnet/cg/cg.py +2 −0 Original line number Diff line number Diff line Loading @@ -334,8 +334,10 @@ def distribute_points(geom, nspts, ewpts): line_of_points = create_points_along_line(top, bot, nspts) points.append(line_of_points) if len(points) < 1: return [] points = np.vstack(points) # Perform a spatial intersection check to eject points that are not valid valid = [p for p in points if xy_in_polygon(p[0], p[1], geom)] Loading autocnet/graph/network.py +77 −1 Original line number Diff line number Diff line Loading @@ -17,6 +17,9 @@ import shapely.geometry import shapely.wkt as swkt import shapely.ops import pyproj from plio.io.io_controlnetwork import from_isis from plio.io import io_hdf, io_json from plio.utils import utils as io_utils from plio.io.io_gdal import GeoDataset Loading @@ -31,7 +34,7 @@ from autocnet.graph import markov_cluster from autocnet.graph.edge import Edge, NetworkEdge from autocnet.graph.node import Node, NetworkNode from autocnet.io import network as io_network from autocnet.io.db.model import (Images, Keypoints, Matches, Cameras, from autocnet.io.db.model import (Images, Keypoints, Matches, Cameras, Points, Base, Overlay, Edges, Costs, Measures) from autocnet.io.db.connection import new_connection, Parent from autocnet.vis.graph_view import plot_graph, cluster_plot Loading Loading @@ -1631,3 +1634,76 @@ WHERE points.active = True AND measures.active=TRUE AND measures.jigreject=FALSE session.rollback() session.commit() session.close() def place_points_from_cnet(self, cnet): semi_major, semi_minor = config["spatial"]["semimajor_rad"], config["spatial"]["semiminor_rad"] ecef = pyproj.Proj(proj='geocent', a=semi_major, b=semi_minor) lla = pyproj.Proj(proj='latlon', a=semi_major, b=semi_minor) if isinstance(cnet, str): cnet = from_isis(cnet) # rename some columns newcols = [] for i, c in enumerate(cnet.columns): if i == 1: newcols.append('pointtype') elif i == 5: newcols.append('pointignore') elif i == 6: newcols.append('pointjigsawRejected') elif i == 25: newcols.append('measuretype') else: newcols.append(c) cnet.columns = newcols cnetpoints = cnet.groupby('id') points = [] session = Session() for id, cnetpoint in cnetpoints: def get_measures(row): res = session.query(Images).filter(Images.serial == row.serialnumber).one() return Measures(pointid=id, imageid=int(res.id), # Need to grab this measuretype=int(row.measuretype), serial=row.serialnumber, sample=float(row['sample']), line=float(row['line']), sampler=float(row.sampleResidual), liner=float(row.lineResidual), active=not row.ignore, # active = ~ignored jigreject=row.jigsawRejected, aprioriline=float(row.aprioriline), apriorisample=float(row.apriorisample), linesigma=float(row.linesigma), samplesigma=float(row.samplesigma)) measures = cnetpoint.apply(get_measures, axis=1) row = cnetpoint.iloc[0] x,y,z= row.adjustedX, row.adjustedY, row.adjustedZ lon, lat, alt = pyproj.transform(ecef, lla, x, y, z) point = Points(identifier=id, active=not row.pointignore, # active = ~ignored apriori= shapely.geometry.Point(float(row.aprioriX), float(row.aprioriY), float(row.aprioriZ)), adjusted= shapely.geometry.Point(float(row.adjustedX),float(row.adjustedY),float(row.adjustedZ)), pointtype=float(row.pointtype)) point.measures = list(measures) points.append(point) session.add_all(points) session.commit() session.close() @classmethod def from_cnet(cls, cnet, filelist): """ """ networkobj = cls.from_filelist(filelist) networkobj.place_points_from_cnet(cnet) return networkobj autocnet/graph/node.py +3 −0 Original line number Diff line number Diff line Loading @@ -6,6 +6,7 @@ import warnings from csmapi import csmapi import numpy as np import pandas as pd from plio.io.io_gdal import GeoDataset from plio.io.isis_serial_number import generate_serial_number from skimage.transform import resize Loading Loading @@ -661,8 +662,10 @@ class NetworkNode(Node): except Exception as e: warnings.warn('Unable to get the Geodata from dem.\n{}'.format(e)) geodata = 0.0 footprint_latlon = generate_latlon_footprint(self.camera, boundary, dem=geodata) footprint_latlon.FlattenTo2D() return footprint_latlon else: # in database, return footprint footprint_latlon = res.footprint_latlon Loading autocnet/graph/tests/test_network_graph.py +48 −0 Original line number Diff line number Diff line import pytest import pandas as pd from autocnet.io.db import model from autocnet import Session, engine from autocnet.graph.network import NetworkCandidateGraph from unittest.mock import patch, PropertyMock, MagicMock @pytest.fixture() def cnet(): return pd.DataFrame.from_dict({ 'id' : [1], 'pointtype' : 2, 'serialnumber' : ['BRUH'], 'jigsawRejected' : [False], 'sampleResidual' : [0.1], 'pointingore' : [False], 'pointjigsawRejected': [False], 'lineResidual' : [0.1], 'linesigma' : [0], 'samplesigma': [0], 'adjustedCovar' : [[]], 'apriorisample' : [0], 'aprioriline' : [0], 'line' : [1], 'sample' : [2], 'ignore': [False], 'adjustedX' : [0], 'adjustedY' : [0], 'adjustedZ' : [0], 'aprioriX' : [0], 'aprioriY' : [0], 'aprioriZ' : [0], 'measuretype' : [1] }) def test_creation(): ncg = NetworkCandidateGraph() @pytest.mark.parametrize("image_data, expected_npoints", [({'id':1, 'serial': 'BRUH'}, 1)]) def test_place_points_from_cnet(session, cnet, image_data, expected_npoints): model.Images.create(session, **image_data) ncg = NetworkCandidateGraph.from_database() ncg.place_points_from_cnet(cnet) resp = session.query(model.Points) assert len(resp.all()) == expected_npoints assert len(resp.all()) == cnet.shape[0] autocnet/io/db/tests/test_model.py +2 −1 Original line number Diff line number Diff line Loading @@ -5,13 +5,14 @@ import numpy as np import pandas as pd import pytest import sqlalchemy from shapely.geometry import MultiPolygon, Polygon, Point from unittest.mock import MagicMock, patch from autocnet.io.db import model from autocnet import Session, engine from autocnet.graph.network import NetworkCandidateGraph from shapely.geometry import MultiPolygon, Polygon, Point @pytest.fixture def tables(): return engine.table_names() Loading Loading
autocnet/cg/cg.py +2 −0 Original line number Diff line number Diff line Loading @@ -334,8 +334,10 @@ def distribute_points(geom, nspts, ewpts): line_of_points = create_points_along_line(top, bot, nspts) points.append(line_of_points) if len(points) < 1: return [] points = np.vstack(points) # Perform a spatial intersection check to eject points that are not valid valid = [p for p in points if xy_in_polygon(p[0], p[1], geom)] Loading
autocnet/graph/network.py +77 −1 Original line number Diff line number Diff line Loading @@ -17,6 +17,9 @@ import shapely.geometry import shapely.wkt as swkt import shapely.ops import pyproj from plio.io.io_controlnetwork import from_isis from plio.io import io_hdf, io_json from plio.utils import utils as io_utils from plio.io.io_gdal import GeoDataset Loading @@ -31,7 +34,7 @@ from autocnet.graph import markov_cluster from autocnet.graph.edge import Edge, NetworkEdge from autocnet.graph.node import Node, NetworkNode from autocnet.io import network as io_network from autocnet.io.db.model import (Images, Keypoints, Matches, Cameras, from autocnet.io.db.model import (Images, Keypoints, Matches, Cameras, Points, Base, Overlay, Edges, Costs, Measures) from autocnet.io.db.connection import new_connection, Parent from autocnet.vis.graph_view import plot_graph, cluster_plot Loading Loading @@ -1631,3 +1634,76 @@ WHERE points.active = True AND measures.active=TRUE AND measures.jigreject=FALSE session.rollback() session.commit() session.close() def place_points_from_cnet(self, cnet): semi_major, semi_minor = config["spatial"]["semimajor_rad"], config["spatial"]["semiminor_rad"] ecef = pyproj.Proj(proj='geocent', a=semi_major, b=semi_minor) lla = pyproj.Proj(proj='latlon', a=semi_major, b=semi_minor) if isinstance(cnet, str): cnet = from_isis(cnet) # rename some columns newcols = [] for i, c in enumerate(cnet.columns): if i == 1: newcols.append('pointtype') elif i == 5: newcols.append('pointignore') elif i == 6: newcols.append('pointjigsawRejected') elif i == 25: newcols.append('measuretype') else: newcols.append(c) cnet.columns = newcols cnetpoints = cnet.groupby('id') points = [] session = Session() for id, cnetpoint in cnetpoints: def get_measures(row): res = session.query(Images).filter(Images.serial == row.serialnumber).one() return Measures(pointid=id, imageid=int(res.id), # Need to grab this measuretype=int(row.measuretype), serial=row.serialnumber, sample=float(row['sample']), line=float(row['line']), sampler=float(row.sampleResidual), liner=float(row.lineResidual), active=not row.ignore, # active = ~ignored jigreject=row.jigsawRejected, aprioriline=float(row.aprioriline), apriorisample=float(row.apriorisample), linesigma=float(row.linesigma), samplesigma=float(row.samplesigma)) measures = cnetpoint.apply(get_measures, axis=1) row = cnetpoint.iloc[0] x,y,z= row.adjustedX, row.adjustedY, row.adjustedZ lon, lat, alt = pyproj.transform(ecef, lla, x, y, z) point = Points(identifier=id, active=not row.pointignore, # active = ~ignored apriori= shapely.geometry.Point(float(row.aprioriX), float(row.aprioriY), float(row.aprioriZ)), adjusted= shapely.geometry.Point(float(row.adjustedX),float(row.adjustedY),float(row.adjustedZ)), pointtype=float(row.pointtype)) point.measures = list(measures) points.append(point) session.add_all(points) session.commit() session.close() @classmethod def from_cnet(cls, cnet, filelist): """ """ networkobj = cls.from_filelist(filelist) networkobj.place_points_from_cnet(cnet) return networkobj
autocnet/graph/node.py +3 −0 Original line number Diff line number Diff line Loading @@ -6,6 +6,7 @@ import warnings from csmapi import csmapi import numpy as np import pandas as pd from plio.io.io_gdal import GeoDataset from plio.io.isis_serial_number import generate_serial_number from skimage.transform import resize Loading Loading @@ -661,8 +662,10 @@ class NetworkNode(Node): except Exception as e: warnings.warn('Unable to get the Geodata from dem.\n{}'.format(e)) geodata = 0.0 footprint_latlon = generate_latlon_footprint(self.camera, boundary, dem=geodata) footprint_latlon.FlattenTo2D() return footprint_latlon else: # in database, return footprint footprint_latlon = res.footprint_latlon Loading
autocnet/graph/tests/test_network_graph.py +48 −0 Original line number Diff line number Diff line import pytest import pandas as pd from autocnet.io.db import model from autocnet import Session, engine from autocnet.graph.network import NetworkCandidateGraph from unittest.mock import patch, PropertyMock, MagicMock @pytest.fixture() def cnet(): return pd.DataFrame.from_dict({ 'id' : [1], 'pointtype' : 2, 'serialnumber' : ['BRUH'], 'jigsawRejected' : [False], 'sampleResidual' : [0.1], 'pointingore' : [False], 'pointjigsawRejected': [False], 'lineResidual' : [0.1], 'linesigma' : [0], 'samplesigma': [0], 'adjustedCovar' : [[]], 'apriorisample' : [0], 'aprioriline' : [0], 'line' : [1], 'sample' : [2], 'ignore': [False], 'adjustedX' : [0], 'adjustedY' : [0], 'adjustedZ' : [0], 'aprioriX' : [0], 'aprioriY' : [0], 'aprioriZ' : [0], 'measuretype' : [1] }) def test_creation(): ncg = NetworkCandidateGraph() @pytest.mark.parametrize("image_data, expected_npoints", [({'id':1, 'serial': 'BRUH'}, 1)]) def test_place_points_from_cnet(session, cnet, image_data, expected_npoints): model.Images.create(session, **image_data) ncg = NetworkCandidateGraph.from_database() ncg.place_points_from_cnet(cnet) resp = session.query(model.Points) assert len(resp.all()) == expected_npoints assert len(resp.all()) == cnet.shape[0]
autocnet/io/db/tests/test_model.py +2 −1 Original line number Diff line number Diff line Loading @@ -5,13 +5,14 @@ import numpy as np import pandas as pd import pytest import sqlalchemy from shapely.geometry import MultiPolygon, Polygon, Point from unittest.mock import MagicMock, patch from autocnet.io.db import model from autocnet import Session, engine from autocnet.graph.network import NetworkCandidateGraph from shapely.geometry import MultiPolygon, Polygon, Point @pytest.fixture def tables(): return engine.table_names() Loading