Commit 59d9d619 authored by Kelvin Rodriguez's avatar Kelvin Rodriguez Committed by Jesse Mapel
Browse files

Added `from_cnet` code (#349)

* fixed foorprint issue

* added from_cnet code

* added tests, addressed some comments

* updated test

* fixed tests???

* working tests maybe????

* WORKING TESTS MAYBEEEEE????????

* removed debug prints
parent 33071706
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -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)]
+77 −1
Original line number Diff line number Diff line
@@ -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
@@ -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
@@ -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
+3 −0
Original line number Diff line number Diff line
@@ -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
@@ -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
+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]

+2 −1
Original line number Diff line number Diff line
@@ -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