Commit 7342a647 authored by jcwbacker's avatar jcwbacker
Browse files

Merge pull request #9 from jlaura/master

Writer to create a control object and write a protocol buffer
parents dc04d3df ec7ae80c
Loading
Loading
Loading
Loading
+0 −0

Empty file added.

+90 −0
Original line number Original line Diff line number Diff line
from time import gmtime, strftime

import pandas as pd


class CSeries(pd.Series):
    """
    A custom pandas series that can accept additional methods
    """
    @property
    def _constructor(self):
        return CustomSeries # pragma: no cover


class C(pd.DataFrame):
    """
    Control network.

    Parameters
    ----------

    Attributes
    ----------

    n : int
        Number of control points

    m : int
        Number of control measures

    creationdate : str
                   The date that this control network was created.

    modifieddate : str
                   The date that this control network was last modified.

    Examples
    --------
    This example illustrates the manual creation of a pandas dataframe with
    a multi-index (created from a list of tuples).

    >>> ids = ['pt1','pt1', 'pt1', 'pt2', 'pt2']
    >>> ptype = [2,2,2,2,2]
    >>> serials = ['a', 'b', 'c', 'b', 'c']
    >>> mtype = [2,2,2,2,2]
    >>> multi_index = pd.MultiIndex.from_tuples(list(zip(ids, ptype, serials, mtype)),\
                                    names=['Id', 'Type', 'Serial Number', 'Measure Type'])
    >>> columns = ['Random Number']
    >>> data_length = 5
    >>> data = np.random.randn(data_length)
    >>> C = control.C(data, index=multi_index, columns=columns)

    """
    def __init__(self, *args, **kwargs):
        super(C, self).__init__(*args, **kwargs)
        self._creationdate = strftime("%Y-%m-%d %H:%M:%S", gmtime())

    @property
    def _constructor(self):
        return C

    _constructor_sliced = CSeries

    @property
    def n(self):
        if not getattr(self, '_n', None):
            self._n = len(self.index.levels[0])
        return self._n

    @property
    def m(self):
        if not getattr(self, '_m', None):
            self._m = len(self)
        return self._m

    @property
    def creationdate(self):
        return self._creationdate

    @property
    def modifieddate(self):
        if not getattr(self, '_modifieddate', None):
            self._modifieddate = 'Not modified'
        return self._modifieddate

    '''
    @modifieddate.setter
    def update_modifieddate(self):
        self._modifieddate = strftime("%Y-%m-%d %H:%M:%S", gmtime())
    '''
 No newline at end of file
+0 −0

Empty file added.

+42 −0
Original line number Original line Diff line number Diff line
import os
import sys
from time import gmtime, strftime
import unittest

import numpy as np
import pandas as pd

sys.path.insert(0, os.path.abspath('..'))

from autocnet.control import control


class TestC(unittest.TestCase):

    def setUp(self):
        ids = ['pt1','pt1', 'pt1', 'pt2', 'pt2']
        ptype = [2,2,2,2,2]
        serials = ['a', 'b', 'c', 'b', 'c']
        mtype = [2,2,2,2,2]

        multi_index = pd.MultiIndex.from_tuples(list(zip(ids, ptype, serials, mtype)),
                                    names=['Id', 'Type', 'Serial Number', 'Measure Type'])


        columns = ['Random Number']
        self.data_length = 5
        data = np.random.randn(self.data_length)

        self.C = control.C(data, index=multi_index, columns=columns)

    def test_n_point(self):
        self.assertEqual(self.C.n,2)

    def test_n_measures(self):
        self.assertEqual(self.C.m, self.data_length)

    def test_modified_date(self):
        self.assertEqual(self.C.modifieddate, 'Not modified')

    def test_creation_date(self):
        self.assertEqual(self.C.creationdate, strftime("%Y-%m-%d %H:%M:%S", gmtime()))
 No newline at end of file
+100 −0
Original line number Original line Diff line number Diff line
from protobuf3.fields import MessageField, EnumField, StringField, BoolField, Int32Field, DoubleField
from enum import Enum
from protobuf3.message import Message


class ControlNetFileHeaderV0002(Message):
    pass


class ControlPointFileEntryV0002(Message):

    class PointType(Enum):
        Free = 2
        Constrained = 3
        Fixed = 4
        obsolete_Tie = 0
        obsolete_Ground = 1

    class AprioriSource(Enum):
        NA = 0
        User = 1
        AverageOfMeasures = 2
        Reference = 3
        Ellipsoid = 4
        DEM = 5
        Basemap = 6
        BundleSolution = 7

    class PointLogData(Message):
        pass

    class Measure(Message):

        class MeasureType(Enum):
            Candidate = 0
            Manual = 1
            RegisteredPixel = 2
            RegisteredSubPixel = 3

        class MeasureLogData(Message):
            pass

ControlNetFileHeaderV0002.add_field('networkId', StringField(field_number=1, required=True))
ControlNetFileHeaderV0002.add_field('targetName', StringField(field_number=2, required=True))
ControlNetFileHeaderV0002.add_field('created', StringField(field_number=3, optional=True))
ControlNetFileHeaderV0002.add_field('lastModified', StringField(field_number=4, optional=True))
ControlNetFileHeaderV0002.add_field('description', StringField(field_number=5, optional=True))
ControlNetFileHeaderV0002.add_field('userName', StringField(field_number=6, optional=True))
ControlNetFileHeaderV0002.add_field('pointMessageSizes', Int32Field(field_number=7, repeated=True))

ControlPointFileEntryV0002.PointLogData.add_field('doubleDataType', Int32Field(field_number=1, optional=True))
ControlPointFileEntryV0002.PointLogData.add_field('doubleDataValue', DoubleField(field_number=2, optional=True))
ControlPointFileEntryV0002.PointLogData.add_field('boolDataType', Int32Field(field_number=3, optional=True))
ControlPointFileEntryV0002.PointLogData.add_field('boolDataValue', BoolField(field_number=4, optional=True))
ControlPointFileEntryV0002.Measure.MeasureLogData.add_field('doubleDataType', Int32Field(field_number=1, optional=True))
ControlPointFileEntryV0002.Measure.MeasureLogData.add_field('doubleDataValue', DoubleField(field_number=2, optional=True))
ControlPointFileEntryV0002.Measure.MeasureLogData.add_field('boolDataType', Int32Field(field_number=3, optional=True))
ControlPointFileEntryV0002.Measure.MeasureLogData.add_field('boolDataValue', BoolField(field_number=4, optional=True))
ControlPointFileEntryV0002.Measure.add_field('serialnumber', StringField(field_number=1, required=True))
ControlPointFileEntryV0002.Measure.add_field('type', EnumField(field_number=2, required=True, enum_cls=ControlPointFileEntryV0002.Measure.MeasureType))
ControlPointFileEntryV0002.Measure.add_field('sample', DoubleField(field_number=3, optional=True))
ControlPointFileEntryV0002.Measure.add_field('line', DoubleField(field_number=4, optional=True))
ControlPointFileEntryV0002.Measure.add_field('sampleResidual', DoubleField(field_number=5, optional=True))
ControlPointFileEntryV0002.Measure.add_field('lineResidual', DoubleField(field_number=6, optional=True))
ControlPointFileEntryV0002.Measure.add_field('choosername', StringField(field_number=7, optional=True))
ControlPointFileEntryV0002.Measure.add_field('datetime', StringField(field_number=8, optional=True))
ControlPointFileEntryV0002.Measure.add_field('editLock', BoolField(field_number=9, optional=True))
ControlPointFileEntryV0002.Measure.add_field('ignore', BoolField(field_number=10, optional=True))
ControlPointFileEntryV0002.Measure.add_field('jigsawRejected', BoolField(field_number=11, optional=True))
ControlPointFileEntryV0002.Measure.add_field('diameter', DoubleField(field_number=12, optional=True))
ControlPointFileEntryV0002.Measure.add_field('apriorisample', DoubleField(field_number=13, optional=True))
ControlPointFileEntryV0002.Measure.add_field('aprioriline', DoubleField(field_number=14, optional=True))
ControlPointFileEntryV0002.Measure.add_field('samplesigma', DoubleField(field_number=15, optional=True))
ControlPointFileEntryV0002.Measure.add_field('linesigma', DoubleField(field_number=16, optional=True))
ControlPointFileEntryV0002.Measure.add_field('log', MessageField(field_number=17, repeated=True, message_cls=ControlPointFileEntryV0002.Measure.MeasureLogData))
ControlPointFileEntryV0002.add_field('id', StringField(field_number=1, required=True))
ControlPointFileEntryV0002.add_field('type', EnumField(field_number=2, required=True, enum_cls=ControlPointFileEntryV0002.PointType))
ControlPointFileEntryV0002.add_field('chooserName', StringField(field_number=3, optional=True))
ControlPointFileEntryV0002.add_field('datetime', StringField(field_number=4, optional=True))
ControlPointFileEntryV0002.add_field('editLock', BoolField(field_number=5, optional=True))
ControlPointFileEntryV0002.add_field('ignore', BoolField(field_number=6, optional=True))
ControlPointFileEntryV0002.add_field('jigsawRejected', BoolField(field_number=7, optional=True))
ControlPointFileEntryV0002.add_field('referenceIndex', Int32Field(field_number=8, optional=True))
ControlPointFileEntryV0002.add_field('aprioriSurfPointSource', EnumField(field_number=9, optional=True, enum_cls=ControlPointFileEntryV0002.AprioriSource))
ControlPointFileEntryV0002.add_field('aprioriSurfPointSourceFile', StringField(field_number=10, optional=True))
ControlPointFileEntryV0002.add_field('aprioriRadiusSource', EnumField(field_number=11, optional=True, enum_cls=ControlPointFileEntryV0002.AprioriSource))
ControlPointFileEntryV0002.add_field('aprioriRadiusSourceFile', StringField(field_number=12, optional=True))
ControlPointFileEntryV0002.add_field('latitudeConstrained', BoolField(field_number=13, optional=True))
ControlPointFileEntryV0002.add_field('longitudeConstrained', BoolField(field_number=14, optional=True))
ControlPointFileEntryV0002.add_field('radiusConstrained', BoolField(field_number=15, optional=True))
ControlPointFileEntryV0002.add_field('aprioriX', DoubleField(field_number=16, optional=True))
ControlPointFileEntryV0002.add_field('aprioriY', DoubleField(field_number=17, optional=True))
ControlPointFileEntryV0002.add_field('aprioriZ', DoubleField(field_number=18, optional=True))
ControlPointFileEntryV0002.add_field('aprioriCovar', DoubleField(field_number=19, repeated=True))
ControlPointFileEntryV0002.add_field('adjustedX', DoubleField(field_number=20, optional=True))
ControlPointFileEntryV0002.add_field('adjustedY', DoubleField(field_number=21, optional=True))
ControlPointFileEntryV0002.add_field('adjustedZ', DoubleField(field_number=22, optional=True))
ControlPointFileEntryV0002.add_field('adjustedCovar', DoubleField(field_number=23, repeated=True))
ControlPointFileEntryV0002.add_field('log', MessageField(field_number=24, repeated=True, message_cls=ControlPointFileEntryV0002.PointLogData))
ControlPointFileEntryV0002.add_field('measures', MessageField(field_number=25, repeated=True, message_cls=ControlPointFileEntryV0002.Measure))
Loading