예제 #1
0
파일: layer.py 프로젝트: oso/qgis-etri
class criteria_layer(QgsVectorLayer):

    def __init__(self, layer):
        self.layer = layer
        self.criteria = None
        self.alternatives = None
        self.pt = None
        self.get_criteria()
        self.get_alternatives_and_pt()

    def get_criteria(self):
        provider = self.layer.dataProvider()
        fields = provider.fields()
        self.criteria = Criteria([])

        for field in fields:
            ftype = field.type()
            if (ftype != QVariant.Bool) and (ftype != QVariant.Double) \
                                        and (ftype != QVariant.Int) \
                                        and (ftype != QVariant.LongLong):
                continue

            name = str(field.name())
            crit = Criterion(name, name)
            self.criteria.append(crit)

    def get_alternatives_and_pt(self):
        provider = self.layer.dataProvider()
        self.alternatives = Alternatives([])
        self.pt = PerformanceTable([])

        for feat in provider.getFeatures():
            featid = str(feat.id())
            perfs = {}
            for criterion in self.criteria:
                try:
                    perfs[criterion.id] = float(feat[criterion.id])
                except:
                    perfs[criterion.id] = feat[criterion.id].toDouble()[0]

            self.alternatives.append(Alternative(featid, featid))
            self.pt.append(AlternativePerformances(featid, perfs))

    def get_features_ids(self, aids):
        provider = self.layer.dataProvider()
        self.alternatives = Alternatives([])
        self.pt = PerformanceTable([])

        features = []
        for feat in provider.getFeatures():
            featid = str(feat.id())
            if featid in aids:
                features.append(feat.id())

        return features
예제 #2
0
파일: layer.py 프로젝트: aitmlouk/qgis-etri
class criteria_layer(QgsVectorLayer):
    def __init__(self, layer):
        self.layer = layer
        self.criteria = None
        self.alternatives = None
        self.pt = None
        self.get_criteria()
        self.get_alternatives_and_pt()

    def get_criteria(self):
        provider = self.layer.dataProvider()
        fields = provider.fields()
        self.criteria = Criteria([])

        for field in fields:
            ftype = field.type()
            if (ftype != QVariant.Bool) and (ftype != QVariant.Double) \
                                        and (ftype != QVariant.Int) \
                                        and (ftype != QVariant.LongLong):
                continue

            name = str(field.name())
            crit = Criterion(name, name)
            self.criteria.append(crit)

    def get_alternatives_and_pt(self):
        provider = self.layer.dataProvider()
        self.alternatives = Alternatives([])
        self.pt = PerformanceTable([])

        for feat in provider.getFeatures():
            featid = str(feat.id())
            perfs = {}
            for criterion in self.criteria:
                try:
                    perfs[criterion.id] = float(feat[criterion.id])
                except:
                    perfs[criterion.id] = feat[criterion.id].toDouble()[0]

            self.alternatives.append(Alternative(featid, featid))
            self.pt.append(AlternativePerformances(featid, perfs))

    def get_features_ids(self, aids):
        provider = self.layer.dataProvider()
        self.alternatives = Alternatives([])
        self.pt = PerformanceTable([])

        features = []
        for feat in provider.getFeatures():
            featid = str(feat.id())
            if featid in aids:
                features.append(feat.id())

        return features
예제 #3
0
파일: layer.py 프로젝트: aitmlouk/qgis-etri
    def get_criteria(self):
        provider = self.layer.dataProvider()
        fields = provider.fields()
        self.criteria = Criteria([])

        for field in fields:
            ftype = field.type()
            if (ftype != QVariant.Bool) and (ftype != QVariant.Double) \
                                        and (ftype != QVariant.Int) \
                                        and (ftype != QVariant.LongLong):
                continue

            name = str(field.name())
            crit = Criterion(name, name)
            self.criteria.append(crit)
예제 #4
0
파일: layer.py 프로젝트: oso/qgis-etri
    def get_criteria(self):
        provider = self.layer.dataProvider()
        fields = provider.fields()
        self.criteria = Criteria([])

        for field in fields:
            ftype = field.type()
            if (ftype != QVariant.Bool) and (ftype != QVariant.Double) \
                                        and (ftype != QVariant.Int) \
                                        and (ftype != QVariant.LongLong):
                continue

            name = str(field.name())
            crit = Criterion(name, name)
            self.criteria.append(crit)
예제 #5
0
    def __load_from_xmcda(self, xmcda_file):
        tree = ElementTree.parse(xmcda_file)
        root = tree.getroot()
#        ElementTree.dump(root)
        xmcda_formatversion = root.find('.//formatversion')
        xmcda_crit = root.find('.//criteria')
        xmcda_critval = root.find('.//criteriaValues')
        xmcda_b = root.find('.//alternatives')
        xmcda_pt = root.findall('.//performanceTable')
        xmcda_lbda = root.find('.//methodParameters/parameter/value/real')

        # Update criteria direction
        criteria = Criteria().from_xmcda(xmcda_crit)
        for c in criteria:
            if c.id in self.criteria:
                self.criteria[c.id].disabled = c.disabled
                self.criteria[c.id].direction = c.direction

        # Remove criteria values that are not in the vector layer
        cvs = CriteriaValues()
        cvs.from_xmcda(xmcda_critval)
        for cv in cvs:
            if cv.id not in self.criteria:
                cvs.remove(cv.id)

        for c in self.criteria:
            # Disable criteria for which there are no weights
            if c.id not in cvs:
                c.disabled = True
                cvs.append(CriterionValue(c.id, 0))

        balternatives = Alternatives()
        balternatives.from_xmcda(xmcda_b)

        bpt = PerformanceTable()
        qpt, ppt, vpt = None, None, None

        for xmcda in xmcda_pt:
            if xmcda.get('id') is None:
                bpt.from_xmcda(xmcda)
                for bp, c in product(bpt, self.criteria.get_active()):
                    perfs = bp.performances
                    if c.id not in perfs or perfs[c.id] is None:
                        perfs[c.id] = 0
            elif xmcda.get('id') == 'q':
                qpt = PerformanceTable(id = 'q')
                qpt.from_xmcda(xmcda)
            elif xmcda.get('id') == 'p':
                ppt = PerformanceTable(id = 'p')
                ppt.from_xmcda(xmcda)
            elif xmcda.get('id') == 'v':
                vpt = PerformanceTable(id = 'v')
                vpt.from_xmcda(xmcda)

        if qpt is not None and len(qpt) == 0 and len(ppt) > 0:
            qpt = ppt.copy()
            qpt.id = "q"

        if ppt is not None and len(ppt) == 0 and len(qpt) > 0:
            ppt = qpt.copy()
            ppt.id = "p"

        lbda = float(xmcda_lbda.text)

        self.__check_params_consistency(bpt, qpt, ppt, vpt)

        # Everything is fine
        self.cv = cvs
        self.balternatives = balternatives
        self.bpt = bpt
        self.qpt = qpt
        self.ppt = ppt
        self.vpt = vpt
        self.lbda = lbda

        # Categories Profiles
        self.categories = generate_categories(len(self.bpt) + 1,
                                              prefix = "")
        self.cat_profiles = generate_categories_profiles(self.categories)
예제 #6
0
파일: test_mcda.py 프로젝트: oso/qgis-etri
import sys
sys.path.insert(0, "..")
from mcda.types import Criteria
from xml.etree import ElementTree
from data_ticino_new import *

crit = c.to_xmcda()
ElementTree.dump(crit)

crit2 = Criteria()
crit2.from_xmcda(crit)
print crit2

xmcda = a.to_xmcda()
ElementTree.dump(xmcda[0])
ElementTree.dump(xmcda[1])