Example #1
0
    def testAppendStreetGrow(self):
        map = createMap(self.testdatadir)
        map.open(mode="a")

        streets, group = map.getLayerAndGroupByName("00_Streets")
        streets.open("a")

        # Add a new street
        newstreet = CellElementPolyline(((16.175, 58.5901), (16.176, 58.5905)), objtype=2)

        newbbox = newstreet.bboxrec.union(streets.bboxrec)
        newbbox = newbbox.buffer(streets.scale)
        
        streets.bboxrec = newbbox

        actual = Set([ce for ce in streets.getCellElements()])
        expected = actual.copy()
        
        newstreet.discretizeGeometry(streets.getCell(1))
#        streets.addCellElement(newstreet)
#        expected.add(newstreet)

        actual = Set([ce for ce in streets.getCellElements()])

        # Test if the new streets exists in the layer object
        self.assertEqual(actual, expected)
        
        # Test if the new street was written to file
        streets.close()
        del streets
        del map

        map = createMap(self.testdatadir)
        map.open(mode="a")

        streets, group = map.getLayerAndGroupByName("00_Streets")
        streets.open("r")

#        actual = Set([ce.serialize(cell) for ce in streets.getCellElements()])
#        expected = Set([ce.serialize(cell) for ce in expected])
        actual = Set([ce for ce in streets.getCellElements()])

        self.assertEqual(len(actual), len(expected))

        if actual != expected:
            print "difference:",actual.symmetric_difference(expected)
            print "actual: ",actual
            print "expected: ",expected

        
        self.assertEqual(actual, expected, "Cell elements don't match after read back")
Example #2
0
    def testSimple(self):
        map = createMap(self.testdatadir)
        map.open("a")

        streets,group = map.getLayerAndGroupByName("00_Streets")
        streets.open("a")

        expected = Set([CellElementPolyline(((16.1757486998903914, 58.5899908940009482), (16.1770312736989581, 58.5901528940066783), (16.1780288311056211, 58.5902788940111350)), objtype=3),
                        CellElementPolyline(((16.1770312736989581, 58.5901528940066783), (16.1766037490961025, 58.5908908940327819), (16.1764612408951507, 58.5911788940429688)), objtype=3),
                        CellElementPolyline(((16.1749649047851562, 58.5906388940238685), (16.1766037490961025, 58.5908908940327819), (16.1779575770051451, 58.5910528940385120)), objtype=3)])

        cell = streets.getCell(1)
        actual = Set([ce for ce in streets.getCellElements()])
        
        self.assertEqual(actual, expected)
Example #3
0
    def testAppendStreet(self):
        map = createMap(self.testdatadir)
        map.open(mode="a")

        streets, group = map.getLayerAndGroupByName("00_Streets")
        streets.open("a")

        actual = Set([ce for ce in streets.getCellElements()])
        expected = actual.copy()
        
        # Add a new street
        newstreet = CellElementPolyline(((16.185, 58.5912), (16.186, 58.5915)), objtype=2)
        newstreet.discretizeGeometry(streets.getCell(1))
        streets.addCellElement(newstreet)
        expected.add(newstreet)

        actual = Set([ce for ce in streets.getCellElements()])

        # Test if the new streets exists in the layer object
        self.assertEqual(actual, expected)
        
        # Test if the new street was written to file
        streets.close()
        del streets
        del map

        map = createMap(self.testdatadir)
        map.open()

        streets, group = map.getLayerAndGroupByName("00_Streets")
        streets.open("r")

#        actual = Set([ce.serialize(cell) for ce in streets.getCellElements()])
#        expected = Set([ce.serialize(cell) for ce in expected])
        actual = Set([ce for ce in streets.getCellElements()])
        expected = Set([ce for ce in expected])

        self.assertEqual(len(actual), len(expected))

        if actual != expected:
            for m in actual:
                if m.objtype == 2:
                    print streets.scale[0]
                    print m
                    print newstreet
                    print m==newstreet
        
        self.assertEqual(actual, expected, "Cell elements don't match after read back")
Example #4
0
    def testAddGroup(self):
        map = createMap(self.testdatadir)
        map.open(mode='a')
        map.bigendian = True

        trailgroup = GroupNormal(map, name="00_Trails")

        map.addGroup(trailgroup)

        trailgroup.open("w")

        # Add trail layer and feature to new group
        trails = Layer(map,
                       name="00_Trails",
                       filename="00trails",
                       layertype=LayerTypePolyline)
        trails.open(mode='w')
        map.addLayer(trails)

        trails.setXScale(1e-5)
        trails.setYScale(1e-5)

        trailgroup.addLayer(trails)

        newtrailwkt = "LINESTRING (16.185 58.5912, 16.186 58.5915)"
        newtrail = CellElementPolyline(trails, wkt=newtrailwkt)
        newtrail.discretizeGeometry(trails.getCell(1))
        cellelementrefs = trails.addCellElement(newtrail)
        feature = FeatureNormal(name="Apgatan",
                                layerindex=map.getLayerIndex(trails),
                                objtype=29,
                                cellelementreflist=cellelementrefs)
        trailgroup.addFeature(feature)

        map.writeImage('trails.img')

        map.close()

        os.system("cat " + os.path.join(self.testdatadir, "00map.ini"))

        map = createMap(self.testdatadir)
        map.open('r')

        trailgroup = map.getGroupByName("00_Trails")

        trailgroup.open()

        print "Trails", trails
Example #5
0
    def testAddGroup(self):
        map = createMap(self.testdatadir)
        map.open(mode='a')
        map.bigendian = True

        trailgroup = GroupNormal(map, name="00_Trails")

        map.addGroup(trailgroup)

        trailgroup.open("w")

        # Add trail layer and feature to new group
        trails = Layer(map, name="00_Trails", filename="00trails", layertype=LayerTypePolyline)
        trails.open(mode='w')
        map.addLayer(trails)

        trails.setXScale(1e-5)
        trails.setYScale(1e-5)

        trailgroup.addLayer(trails)
        
        newtrailwkt = "LINESTRING (16.185 58.5912, 16.186 58.5915)"
        newtrail = CellElementPolyline(trails, wkt=newtrailwkt)
        newtrail.discretizeGeometry(trails.getCell(1))
        cellelementrefs = trails.addCellElement(newtrail)
        feature = FeatureNormal(name="Apgatan", layerindex=map.getLayerIndex(trails),
                                objtype=29,
                                cellelementreflist=cellelementrefs)
        trailgroup.addFeature(feature)

        map.writeImage('trails.img')
        
        map.close()

        os.system("cat " +os.path.join(self.testdatadir, "00map.ini"))

        map = createMap(self.testdatadir)
        map.open('r')

        trailgroup = map.getGroupByName("00_Trails")

        trailgroup.open()
        
        print "Trails",trails
Example #6
0
    def testAddPolylineLayer(self):
        trails = Layer(self.map, name="Trails", filename="trails", layertype=LayerTypePolyline)
        trails.open(mode='w')
        self.map.addLayer(trails)

        # Add a new trail
        newtrail = CellElementPolyline(((16.185, 58.5912), (16.186, 58.5915)), objtype=0)
        newtrail.discretizeGeometry(trails.getCell(1))
        trails.addCellElement(newtrail)

        self.map.close()

        map = createMap(self.testdatadir)
        map.open()

        trails, group = map.getLayerAndGroupByName("Trails")

        trails.open('r')

        actual = Set(trails.getCellElements())

        expected = Set([newtrail])
        
        self.assertSetsEqual(actual, expected)
Example #7
0
    def testCreateLayerSansBBox(self):
        m = self.m
        
        layer = Layer(m, name="The Layer", filename="layer", layertype=LayerTypePolyline)
        m.addLayer(layer)
        layer.open("w")

        line = CellElementPolyline(((16.185, 58.5912), (16.186, 58.5915)), objtype=2)
        layer.addCellElement(line)

        self.mi.close()

        ## Read back
        mi = MapImage(self.outimage)
        mi.open('r')

        m = mi.maps[0]
Example #8
0
    def testSimple(self):
        refmap = Map(MapDirectory('./layerdata8'))
        refmap.open('r')
        reflayer = refmap.getLayerByName('00_Trails_4WD')
        reflayer.open('r')
        
        map = Map(MapDirectory(self.testdatadir.dir), maptype=MapTypeImage)
        map.open("w")
        map.bbox = ((-18.04, 28.4), (-17.7, 28.89))
        map.bbox = refmap.bbox

        ## Add trails layer
        trails = Layer(map, name="00_Trails", filename="00trails", layertype=LayerTypePolyline)
        trails.open(mode='w')
        trailstyle = DetailMapLayerStyle()
        trailstyle.style = 'TRAIL_LINE'
        map.addLayer(trails, layerstyle = trailstyle)

        trailwkt = 'LINESTRING (-17.768953959275908 28.775591075650038,-17.768678531255482 28.7757692937809,-17.768346397466143 28.775890806142854,-17.767981860380281 28.775923209439377,-17.767779339777025 28.775923209439377,-17.767212282087907 28.775874604494597,-17.766669526871183 28.775777394605033,-17.766151074126846 28.775647781418947,-17.765438201603384 28.775388555046781,-17.764879244738399 28.775145530322874,-17.764514707652538 28.774943009719617,-17.764239279632111 28.77467568252332,-17.763040357660834 28.774238238020288,-17.762813534585188 28.774189633075505,-17.762513804092368 28.774222036372027,-17.762513804092368 28.774222036372027)'
        trail = CellElementPolyline(trails, wkt=trailwkt, objtype=11)
        cellelementrefs = trails.addCellElement(trail)
        print "cellelementrefs", cellelementrefs

        ## Add group
        roadsgroup = map.getGroupByName('00_Roads')
        roadsgroup.addLayer(trails)
        feature = FeatureNormal(name="Apstigen", layerindex=map.getLayerIndex(trails),
                                objtype=29,
                                cellelementreflist=cellelementrefs)
        roadsgroup.addFeature(feature)

        ## Add topo
        map.addTopo('layerdata8/00t0.blx')
#        map.mapdir.copyfile('layerdata8/topo3d.ini')
        map.close()
        
        map.writeImage('trails.imi')
        
        self.assertTrue('00map.ini' in os.listdir(self.testdatadir.dir))

        files = os.listdir(self.testdatadir.dir)
        expectedfiles = Set(('bmp2bit.ics', 'bmp4bit.ics', '00map.ini', 'add_maps.cfg', 'db00.dbd' ,
                             '00trails.lay', '00trails.clt',
                             'gr0.ext', 'gr0.clp', 'gr0.aux',
                             'gr1.ext', 'gr1.clp', 'gr1.aux',
                             'gr2.ext', 'gr2.clp', 'gr2.aux',
                             'gr3.ext', 'gr3.clp', 'gr3.aux',
                             '00z.dat', '00cn.dat',
                             '00t0.blx', 'topo3d.ini'))
        self.assertEqual(expectedfiles, Set(files))

        expectedinitfile = ""

        inifile = open(os.path.join(self.testdatadir.dir, '00map.ini'))

        print inifile.read()

        map = Map(MapDirectory(self.testdatadir.dir))
        map.open("r")
        roadsgroup = map.getGroupByName('00_Roads')
        roadsgroup.open('r')
        print "features: ", list(roadsgroup.getFeatures())
        trails = map.getLayerByName('00_Trails')
        trails.open('r')
        trails.check()
        print trails.cellnumbers
Example #9
0
    def add_element(self, statement, tags, coords):
      cm = self.charmap
      if statement.tag in ('polygon', 'polyline', 'point'):
        layer, group = self.map.getLayerAndGroupByName(\
            self.map.mapnumstr + '_' + statement.get('layer') )

        objtype = statement.get('objtype') or 1

        if statement.tag == 'polyline':
          assert(layer.layertype == Layer.LayerTypePolyline)
          if len(coords) < 2:
            return

          unk = None
          if self.routable:
              unk = 0
          cellelement = CellElementPolyline.fromfloat(layer, coords, \
                objtype=group.getObjtypeIndex(self.map.getLayerIndex(layer), objtype), unk=None)

          if self.routable:
              routingelements = statement.findall("routing")

              ra = RoutingAttributes()
              ra.segmentflags = 0
              ra.speedcat = 0
              cellelement.routingattributes = ra

              for routing in statement.findall("routing"):
                  for key, value in routing.items():
                      if key == 'oneway':
                          ra.bidirectional = value != 'on'
                      elif key == 'freeway':
                          ra.freeway = (value == 'on')
                      elif key == 'speedcat':
                          ra.speedcat = int(value)
                      elif key == 'segmenttype':
                          ra.segmenttype = int(value)

              if 'junction' in tags and self.tags['junction'] == 'roundabout':
                  ra.roundabout = True
                  ra.bidirectional = False

              if 'oneway' in tags and tags['oneway'] == 'yes':
                  ra.bidirectional = False

        elif statement.tag == 'polygon':
            try:
                objtype = group.getObjtypeIndex(self.map.getLayerIndex(layer), objtype)
                cellelement = CellElementArea.fromfloat(layer, (coords,), 
                                                        objtype=objtype)
            except GeometryError:
                logging.warning('Improper polygon found: ' + str(coords))
                return

        elif statement.tag == 'point':
          assert(layer.layertype == Layer.LayerTypePoint)
          cellelement = CellElementPoint.fromfloat(layer, coords[0],
                         objtype = group.getObjtypeIndex(self.map.getLayerIndex(layer), objtype))
        cellelementrefs = layer.addCellElement(cellelement)

        name = self._findname(statement, tags)

        if hasname(name):
            feature = FeatureNormal(name=cm.translate(name), 
                                    layerindex=self.map.getLayerIndex(layer),
                                    objtype=objtype,
                                    cellelementreflist=cellelementrefs)
            group.addFeature(feature)

      elif statement.tag == 'poi':
        poigroup = self.map.getPOIGroup()
        poilayer = self.map.getPOILayers()[0]

        category = statement.get('category')
        subcategory = statement.get('subcategory') or 'NOSUB1000'

        cat = poigroup.catman.getCategoryByName(category)
        subcat = cat.getSubCategoryByName(subcategory)

        poice = CellElementPOI.fromfloat(poilayer, coords[0], categoryid=cat.id, subcategoryid=subcat.id)

        name = self._findname(statement, tags)

        if hasname(name):
          attributes = []
          for a in statement.findall('attr'):
            if a.get('k') in tags:
              attributes.append(cm.translate(tags[a.get('k')]))
            elif a.text:
              attributes.append(cm.translate(a.text.encode))
            else:
              attributes.append('')

          feature = FeaturePOI(poilayer.addCellElement(poice), [cm.translate(name)] + attributes, cat.id, subcat.id)
          poigroup.addFeature(feature)
      elif statement.tag == 'coastline':
          if len(coords) < 2:
              return

          if self.coastline == None:
              self.coastline = coastline.CoastLine()

          self.coastline.add(coords)
          self.coastlayername = statement.get('layer')
Example #10
0
    def testAddFeature(self):
        map = createMap(self.testdatadir)
        map.open(mode='a')

        roads = map.getGroupByName("00_Roads")

        roads.open('a')

        streets, streetsgroup = map.getLayerAndGroupByName("00_Streets")

        nfeatures=roads.getFeatureCount()
        self.assertEqual(roads.getFeatureCount(), 29)
        
        newstreetwkt = "LINESTRING (16.185 58.5912, 16.186 58.5915)"
        newstreet = CellElementPolyline(streets, wkt=newstreetwkt)
        newstreet.discretizeGeometry(streets.getCell(1))
        cellelementrefs = streets.addCellElement(newstreet)

        feature = FeatureStreet(name="Apgatan",
                                layerindex=map.getLayerIndex(streets),
                                objtype=29,
                                cellelementreflist=cellelementrefs)

        roads.addFeature(feature)

        # Check that the # of features increased
        self.assertEqual(roads.getFeatureCount(), nfeatures+1)

        found=False
        for i in range(0, roads.getFeatureCount()):
            tmpfeature = roads.getFeatureByIndex(i)
            if tmpfeature == feature:
                print feature
                found = True
        self.assertTrue(found, "New feature not found")        

        names = [roads.getFeatureByIndex(i).name for i in range(0, roads.getFeatureCount())]

        self.assertTrue(areSorted(names), "Features are not sorted")

        print roads.layers

        # Re-open map and verify that the new feature is present
        map.close()
        del map
        del streets
        
        map = createMap(self.testdatadir)
        map.open()
        roads = map.getGroupByName("00_Roads")

        print roads.layers

        roads.open('r')

        found = False
        for i in range(0, roads.getFeatureCount()):
            tmpfeature = roads.getFeatureByIndex(i)
            print tmpfeature
            if tmpfeature.name == feature.name:
                streets, streetsgroup = map.getLayerAndGroupByName("00_Streets")
                if tmpfeature == feature:
                    found = True

        # Check that the # of features increased
        self.assertEqual(roads.getFeatureCount(), nfeatures+1)

        self.assertTrue(found, "New feature not found after re-opening the map")        
        names = [roads.getFeatureByIndex(i).name for i in range(0, roads.getFeatureCount())]
        self.assertTrue(areSorted(names), "Features are not sorted")
Example #11
0
    def testAddFeature(self):
        map = createMap(self.testdatadir)
        map.open(mode='a')

        roads = map.getGroupByName("00_Roads")

        roads.open('a')

        streets, streetsgroup = map.getLayerAndGroupByName("00_Streets")

        nfeatures = roads.getFeatureCount()
        self.assertEqual(roads.getFeatureCount(), 29)

        newstreetwkt = "LINESTRING (16.185 58.5912, 16.186 58.5915)"
        newstreet = CellElementPolyline(streets, wkt=newstreetwkt)
        newstreet.discretizeGeometry(streets.getCell(1))
        cellelementrefs = streets.addCellElement(newstreet)

        feature = FeatureStreet(name="Apgatan",
                                layerindex=map.getLayerIndex(streets),
                                objtype=29,
                                cellelementreflist=cellelementrefs)

        roads.addFeature(feature)

        # Check that the # of features increased
        self.assertEqual(roads.getFeatureCount(), nfeatures + 1)

        found = False
        for i in range(0, roads.getFeatureCount()):
            tmpfeature = roads.getFeatureByIndex(i)
            if tmpfeature == feature:
                print feature
                found = True
        self.assertTrue(found, "New feature not found")

        names = [
            roads.getFeatureByIndex(i).name
            for i in range(0, roads.getFeatureCount())
        ]

        self.assertTrue(areSorted(names), "Features are not sorted")

        print roads.layers

        # Re-open map and verify that the new feature is present
        map.close()
        del map
        del streets

        map = createMap(self.testdatadir)
        map.open()
        roads = map.getGroupByName("00_Roads")

        print roads.layers

        roads.open('r')

        found = False
        for i in range(0, roads.getFeatureCount()):
            tmpfeature = roads.getFeatureByIndex(i)
            print tmpfeature
            if tmpfeature.name == feature.name:
                streets, streetsgroup = map.getLayerAndGroupByName(
                    "00_Streets")
                if tmpfeature == feature:
                    found = True

        # Check that the # of features increased
        self.assertEqual(roads.getFeatureCount(), nfeatures + 1)

        self.assertTrue(found,
                        "New feature not found after re-opening the map")
        names = [
            roads.getFeatureByIndex(i).name
            for i in range(0, roads.getFeatureCount())
        ]
        self.assertTrue(areSorted(names), "Features are not sorted")