def testAddPointLayer(self): points = Layer(self.map, name="Points", filename="points", layertype=LayerTypePoint) points.open(mode='w') self.map.addLayer(points) # Add a new point newpoint = CellElementPoint((16.185, 58.5912), objtype=10) newpoint.discretizeGeometry(points.getCell(1)) points.addCellElement(newpoint) self.map.close() map = createMap(self.testdatadir) map.open() points, group = map.getLayerAndGroupByName("Points") points.open('r') actual = Set(points.getCellElements()) expected = Set([newpoint]) self.assertSetsEqual(actual, expected)
def testAddPoint(self): outimage = os.path.join(self.tempdir.dir, 'test.imi') mi = MapImage(outimage) mi.open('w') m = mi.createMap() m.scale = 1e-3 m.bbox = ((-3.0, -4.0), (2.0, 1.0)) m.open("w") layer = Layer(m, name="The Layer", filename="layer", layertype=LayerTypePoint, nlevels = 1) m.addLayer(layer) layer.open("w") point = CellElementPoint((-1.5006, -3.5006)) layer.addCellElement(point) cell = layer.getCell(point.cellnum) self.assertEqual(point.cellnum, 4) point.discretizeGeometry(layer.getCell(point.cellnum)) self.assertAlmostEqual(point.x, -1.501) self.assertAlmostEqual(point.y, -3.501) mi.close() ## Read back mi = MapImage(outimage) mi.open('r') m = mi.maps[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')