def main: map = mapscript.mapObj() map.name = 'Test Map' map.setSize(300, 300) map.setExtent(-180.0,-90.0,180.0,90.0) map.imagecolor.setRGB(80, 180, 80) map.units = mapscript.MS_DD layer = mapscript.layerObj(map) layer.name = "regioni" layer.type = mapscript.MS_LAYER_POLYGON layer.status = mapscript.MS_DEFAULT layer.data = os.getcwd() + '/../data/regioni' class1 = mapscript.classObj(layer) class1.name = "Regioni" style = mapscript.styleObj(class1) style.outlinecolor.setRGB(100, 100, 100) style.color.setRGB(200, 200, 200) extent = layer.getExtent() map.setExtent(extent.minx, extent.miny, extent.maxx, extent.maxy) mapimage = map.draw() mapimage.save(os.getcwd() + '/../images/mapscript_map.png')
def set_cartography(self, layer): """ Sets the cartograhy for this layer TODO: This currently sets cartograpy to None, but should be a lookup to a set of cartographies or be a dynamically created one """ # Select cartograpy or use default one carto_requested = self.request.GET.get('cartography', '') if carto_requested: self.cartograpy = None # Class and style settings if self.cartography: for cart in self.cartography: # Set categorization category = mapscript.classObj(layer) category.setExpression(cart['expression']) category.name = cart['name'] # Set category style style = mapscript.styleObj(category) style.color.setHex(to_hex(cart['color'])) else: category = mapscript.classObj(layer) category.name = layer.name style = mapscript.styleObj(category) style.color.setHex('#FF00FF') return layer
def __agregar_simbologia_basica__(layer): class1 = mapscript.classObj(layer) class1.name = 'Default' style = mapscript.styleObj(class1) if layer.type == mapscript.MS_LAYER_POINT: style.symbolname = 'circle' style.size = 8 style.minsize = 8 style.maxsize = 10 style.maxwidth = 2 style.outlinecolor.setRGB(30, 30, 30) style.color.setRGB(31, 120, 180) elif layer.type == mapscript.MS_LAYER_POLYGON: style.outlinecolor.setRGB(126, 109, 83) style.color.setRGB(210, 182, 138) elif layer.type == mapscript.MS_LAYER_LINE: style.color.setRGB(76, 38, 0) style.width = 4 style.minwidth = 4 style.maxwidth = 6 style2 = mapscript.styleObj(class1) style2.color.setRGB(255, 206, 128) style2.width = 2 style2.minwidth = 2 style2.maxwidth = 4 elif layer.type == mapscript.MS_LAYER_RASTER: layer.offsite = mapscript.colorObj(0, 0, 0)
def serializeSimpleFillSymbolLayer(self, sl): """Serialize a QGis simple fill symbol layer into MapServer styles""" msStyleBg = mapscript.styleObj(self.msClass) msStyleBg.angle = sl.angle() msStyleBg.color = utils.serializeColor(sl.fillColor()) msStyleBg.opacity = int((sl.fillColor().alpha() / 255.0) * 100) # Only serialize outline if we have one if sl.borderStyle() != Qt.NoPen: msStyleOutline = mapscript.styleObj(self.msClass) msStyleOutline.outlinecolor = utils.serializeColor(sl.borderColor()) # QGis draws a default outline of .26mm (roughly 1px) even when the width is set to zero msStyleOutline.width = utils.sizeUnitToPx(sl.borderWidth(), sl.borderWidthUnit()) \ if sl.borderWidth() > 0 \ else utils.DEFAULT_OUTLINE_WIDTH # Assume that this is our only outline and set the layer's size units to map units # if we are using map units in QGis. This breaks every property with a size unit set to # anything other than the map unit. if (sl.borderWidth() > 0): utils.maybeSetLayerSizeUnitFromMap(sl.borderWidthUnit(), self.msLayer) # Emit line pattern only if we have a non-solid pen if sl.borderStyle() != Qt.SolidLine: utils.setPenStylePattern(msStyleOutline, utils.serializePenStylePattern(sl))
def set_cartography(self, layer): """ Sets the cartograhy for this layer TODO: This currently sets cartograpy to None, but should be a lookup to a set of cartographies or be a dynamically created one """ # Select cartograpy or use default one carto_requested = self.request.GET.get("cartography", "") if carto_requested: self.cartograpy = None # Class and style settings if self.cartography: for cart in self.cartography: # Set categorization category = mapscript.classObj(layer) category.setExpression(cart["expression"]) category.name = cart["name"] # Set category style style = mapscript.styleObj(category) style.color.setHex(to_hex(cart["color"])) else: category = mapscript.classObj(layer) category.name = layer.name style = mapscript.styleObj(category) style.color.setHex("#FF00FF") return layer
def testStyleConstructor(self): """styleObj Constructor""" self.initMap() style = mapscript.styleObj(self.map.getLayer(1).getClass(0)) assert style.refcount == 2, style.refcount assert style.thisown == 1, style.thisown style = mapscript.styleObj() assert style.refcount == 1, style.refcount assert style.thisown == 1, style.thisown
def get_vector_layer(self, field_name): """ Connect this layer to a vector data model. """ # Get base layer layer = self.get_base_layer() layer.type = self.layer_types[field_name] # Set connection to DB layer.setConnectionType(mapscript.MS_POSTGIS, '') connection_template = ( 'host={host} dbname={dbname} user={user} ' 'port={port} password={password}' ) layer.connection = connection_template.format( host=settings.DATABASES['default']['HOST'], dbname=settings.DATABASES['default']['NAME'], user=settings.DATABASES['default']['USER'], port=settings.DATABASES['default']['PORT'], password=settings.DATABASES['default']['PASSWORD'] ) # Select data column layer.data = 'geom FROM {0}'.format(self.model._meta.db_table) # Set class item if self.classitem: layer.classitem = self.classitem # Cartography settings if self.cartography: for cart in self.cartography: # Set categorization and name category = mapscript.classObj(layer) category.setExpression(cart.get('expression', '')) category.name = cart.get('name', cart.get('expression', '')) # Set category style style = mapscript.styleObj(category) style.color.setHex(to_hex(cart.get('color', '#777777'))) style.outlinecolor.setHex(to_hex(cart.get('outlinecolor', '#000000'))) style.width = cart.get('width', 1) # Set symbol name now, this will be linked to the map level # symbolset when registering layers in map. if cart.has_key('symbol'): style.symbolname = cart.get('symbol') else: category = mapscript.classObj(layer) category.name = layer.name style = mapscript.styleObj(category) style.color.setHex('#777777') style.outlinecolor.setHex('#000000') style.width = 1 return layer
def get_vector_layer(self, field_name): """ Connect this layer to a vector data model. """ # Get base layer layer = self.get_base_layer() layer.type = self.layer_types[field_name] # Set connection to DB layer.setConnectionType(mapscript.MS_POSTGIS, '') connection_template = ('host={host} dbname={dbname} user={user} ' 'port={port} password={password}') layer.connection = connection_template.format( host=settings.DATABASES['default']['HOST'], dbname=settings.DATABASES['default']['NAME'], user=settings.DATABASES['default']['USER'], port=settings.DATABASES['default']['PORT'], password=settings.DATABASES['default']['PASSWORD']) # Select data column layer.data = 'geom FROM {0}'.format(self.model._meta.db_table) # Set class item if self.classitem: layer.classitem = self.classitem # Cartography settings if self.cartography: for cart in self.cartography: # Set categorization and name category = mapscript.classObj(layer) category.setExpression(cart.get('expression', '')) category.name = cart.get('name', cart.get('expression', '')) # Set category style style = mapscript.styleObj(category) style.color.setHex(to_hex(cart.get('color', '#777777'))) style.outlinecolor.setHex( to_hex(cart.get('outlinecolor', '#000000'))) style.width = cart.get('width', 1) # Set symbol name now, this will be linked to the map level # symbolset when registering layers in map. if cart.has_key('symbol'): style.symbolname = cart.get('symbol') else: category = mapscript.classObj(layer) category.name = layer.name style = mapscript.styleObj(category) style.color.setHex('#777777') style.outlinecolor.setHex('#000000') style.width = 1 return layer
def get_styleObj(self, classObj=None, **kwargs): if classObj: styleObj = ms.styleObj(classObj) else: styleObj = ms.styleObj(classObj) for attr, value in kwargs.items(): if 'color' in attr: if isinstance(value, dict): value = self.get_colorObj(**value) else: value = self.get_colorObj(*value) setattr(styleObj, attr, value) return styleObj
def get_vector_layer(self, field_name): """ Connect this layer to a vector data model. """ # Get base layer layer = self.get_base_layer() layer.type = self.layer_types[field_name] # Set connection to DB layer.setConnectionType(mapscript.MS_POSTGIS, "") layer.connection = "host={host} dbname={dbname} user={user} " "port={port} password={password}".format( host=settings.DATABASES["default"]["HOST"], dbname=settings.DATABASES["default"]["NAME"], user=settings.DATABASES["default"]["USER"], port=settings.DATABASES["default"]["PORT"], password=settings.DATABASES["default"]["PASSWORD"], ) # Select data column layer.data = "geom FROM {0}".format(self.model._meta.db_table) # Set class item if self.classitem: layer.classitem = self.classitem # Cartography settings if self.cartography: for cart in self.cartography: # Set categorization and name category = mapscript.classObj(layer) category.setExpression(cart.get("expression", "")) category.name = cart.get("name", cart.get("expression", "")) # Set category style style = mapscript.styleObj(category) style.color.setHex(to_hex(cart.get("color", "#777777"))) style.outlinecolor.setHex(to_hex(cart.get("outlinecolor", "#000000"))) style.width = cart.get("width", 1) # Set symbol name now, this will be linked to the map level # symbolset when registering layers in map. if cart.has_key("symbol"): style.symbolname = cart.get("symbol") else: category = mapscript.classObj(layer) category.name = layer.name style = mapscript.styleObj(category) style.color.setHex("#777777") style.outlinecolor.setHex("#000000") style.width = 1 return layer
def serializeSimpleLineSymbolLayer(self, sl, hatchProperties=None): """Serialize a QGis simple line symbol layer into a MapServer style""" msStyle = mapscript.styleObj(self.msClass); # Line cap and line join msStyle.linecap = utils.serializePenCapStyle(sl.penCapStyle()) msStyle.linejoin = utils.serializePenJoinStyle(sl.penJoinStyle()) # If `hatchProperties` is a dict, we are serializing a line symbol layer inside a line # pattern fill, so we act accordingly and emit the respective properties. if isinstance(hatchProperties, dict): msStyle.symbolname = utils.serializeHatchSymbol(self.msMap) msStyle.size = hatchProperties['size'] msStyle.angle = hatchProperties['angle'] msStyle.color = utils.serializeColor(sl.color()) else: msStyle.color = utils.serializeColor(sl.color()) # Emit line pattern only if we have a non-solid pen if sl.penStyle() != Qt.NoPen and sl.penStyle() != Qt.SolidLine: utils.setPenStylePattern(msStyle, utils.serializePenStylePattern(sl)) msStyle.width = 0 \ if sl.penStyle() == Qt.NoPen \ else utils.sizeUnitToPx(sl.width(), sl.widthUnit()) # Assume that this is our only outline and set the layer's size units to map units # if we are using map units in QGis. This breaks every property with a size unit set to # anything other than the map unit. if (sl.width() > 0) and (hatchProperties == None): utils.maybeSetLayerSizeUnitFromMap(sl.widthUnit(), self.msLayer)
def update_classobj_from_dict(classobj, c, mapobj): if 'expression' in c: classobj.setExpression(c['expression'].encode('utf8')) if 'label' in c: update_labelobj_from_dict(classobj.label, c['label'], mapobj) if 'maxscaledenom' in c: classobj.maxscaledenom = c['maxscaledenom'] if 'minscaledenom' in c: classobj.minscaledenom = c['minscaledenom'] if 'name' in c: classobj.name = c['name'].encode('utf8') if 'text' in c: classobj.setText(c['text']) if 'title' in c: classobj.title = c['title'] if 'styles' in c: for style in c['styles']: styleobj = mapscript.styleObj() update_styleobj_from_dict(styleobj, style, mapobj) classobj.insertStyle(styleobj) return classobj
def get_vector_layer(data, name, group, crs=None): """ Mapscript Layer для векторных данных. """ layer = mapscript.layerObj() layer.type = mapscript.MS_LAYER_POLYGON layer.status = mapscript.MS_ON # mapscript.MS_DEFAULT layer.name = name layer.group = group layer.setProjection('EPSG:4326') layer.metadata.set('wms_srs', 'EPSG:4326') layer.metadata.set('wms_title', name) for polygon in data: shape = mapscript.shapeObj_fromWKT(polygon.wkt) layer.addFeature(shape) # layer.setExtent({'minx': 3, 'miny': 3, 'maxx': 3, 'maxy': 3}) # layer.setExtent(1, 2, 3, 4) # layer.setProjection('EPSG:4326') # layer.setProcessing("SCALE=0,255") # layer.setProcessing("DITHER=YES") # layer.setProcessing("RESAMPLE=BILINEAR") # BILINEAR, AVERAGE, NEAREST # layer.setProcessing("EXTENT_PRIORITY=WORLD") # layer.setProcessing("LOAD_FULL_RES_IMAGE=NO") # layer.setProcessing("LOAD_WHOLE_IMAGE=NO") c = mapscript.classObj(layer) style = mapscript.styleObj(c) fill_color = mapscript.colorObj(0, 255, 0) out_color = mapscript.colorObj(0, 0, 255) style.color = fill_color style.outlinecolor = out_color style.opacity = 50 layer.opacity = 50 return layer
def testStyleBinding(self): """attribute binding can be set and get""" new_style = mapscript.styleObj() assert (not new_style.getBinding(mapscript.MS_STYLE_BINDING_COLOR)) new_style.setBinding(mapscript.MS_STYLE_BINDING_COLOR, "NEW_BINDING") assert (new_style.getBinding( mapscript.MS_STYLE_BINDING_COLOR) == "NEW_BINDING")
def testCloneStyle(self): """check attributes of a cloned style""" new_style = mapscript.styleObj() new_style.color.setHex('#808080') clone = new_style.clone() assert clone.thisown == 1 assert clone.color.toHex() == '#808080'
def testInsertStylePastEnd(self): """NewStylesTestCase.testInsertStylePastEnd: inserting a style past the end of the list raises the proper error""" p_layer = self.map.getLayerByName('POINT') class0 = p_layer.getClass(0) new_style = mapscript.styleObj() self.assertRaises(mapscript.MapServerChildError, class0.insertStyle, new_style, 6)
def testStyleColorSettable(self): """a style can be set with a color tuple""" new_style = mapscript.styleObj() new_style.color.setRGB(1, 2, 3) assert new_style.color.red == 1 assert new_style.color.green == 2 assert new_style.color.blue == 3
def update_classobj_from_dict(classobj,c,mapobj): if 'expression' in c: classobj.setExpression(c['expression'].encode('utf8')) if 'label' in c: update_labelobj_from_dict(classobj.label,c['label'],mapobj) if 'maxscaledenom' in c: classobj.maxscaledenom = c['maxscaledenom'] if 'minscaledenom' in c: classobj.minscaledenom = c['minscaledenom'] if 'name' in c: classobj.name = c['name'].encode('utf8') if 'text' in c: classobj.setText(c['text']) if 'title' in c: classobj.title = c['title'] if 'styles' in c: for style in c['styles']: styleobj = mapscript.styleObj() update_styleobj_from_dict(styleobj,style,mapobj) classobj.insertStyle(styleobj) return classobj
def draw_map_wfs(name, save=0): # print("making map in thread %s" % (name)) mo = mapscript.mapObj(TESTMAPFILE) # WFS layer lo = mapscript.layerObj() lo.name = 'cheapo_wfs' lo.setProjection('+init=epsg:4326') lo.connectiontype = mapscript.MS_WFS lo.connection = 'http://zcologia.com:9001/mapserver/members/features.rpy?' lo.metadata.set('wfs_service', 'WFS') lo.metadata.set('wfs_typename', 'users') lo.metadata.set('wfs_version', '1.0.0') lo.type = mapscript.MS_LAYER_POINT lo.status = mapscript.MS_DEFAULT lo.labelitem = 'zco:mid' so1 = mapscript.styleObj() so1.color.setHex('#FFFFFF') so1.size = 9 so1.symbol = 1 # mo.symbolset.index('circle') so2 = mapscript.styleObj() so2.color.setHex('#333333') so2.size = 7 so2.symbol = 1 # mo.symbolset.index('circle') co = mapscript.classObj() co.label.type = mapscript.MS_BITMAP co.label.size = mapscript.MS_SMALL co.label.color.setHex('#000000') co.label.outlinecolor.setHex('#FFFFFF') co.label.position = mapscript.MS_AUTO co.insertStyle(so1) co.insertStyle(so2) lo.insertClass(co) mo.insertLayer(lo) if not mo.web.imagepath: mo.web.imagepath = os.environ.get('TEMP', None) or INCOMING mo.debug = mapscript.MS_ON im = mo.draw() if save: im.save('threadtest_wfs_%s.png' % (name))
def testInsertStyle(self): """styleObj Insert""" self.initMap() style = mapscript.styleObj() assert style.refcount == 1, style.refcount assert style.thisown == 1, style.thisown self.map.getLayer(1).getClass(0).insertStyle(style) assert style.refcount == 2, style.refcount assert style.thisown == 1, style.thisown
def create_default_style(): style = mapscript.styleObj() style.backgroundcolor.setHex('#00ff00') style.color.setHex('#ff0000') style.outlinecolor.setHex('#aa00aa') style.size = 12 style.symbol = 3 style.width = 4 return style
def testPattern5(self): """pattern length is read-only""" si = mapscript.styleObj() exception = None try: si.patternlength = 0 except Exception: exception = True assert exception is True
def testPattern3(self): """a pattern must have at least 2 elements""" si = mapscript.styleObj() exception = None try: si.pattern = [1.0] except Exception: exception = True assert exception is True
def serializeSimpleMarkerSymbolLayer(self, sl, fillProperties=None): """Serialize a QGis simple marker symbol layer into MapServer styles""" # Emit fill only if it's visible and the marker is polygonal markerName = unicode(sl.name()).encode('utf-8') if (sl.fillColor().alpha() != 0) and utils.isWellKnownMarkerPolygonal(markerName): msFillSymbol = utils.serializeWellKnownMarker(markerName, True) self.msMap.symbolset.appendSymbol(msFillSymbol) msStyleBg = mapscript.styleObj(self.msClass) msStyleBg.symbolname = msFillSymbol.name msStyleBg.color = utils.serializeColor(sl.fillColor()) msStyleBg.size = utils.sizeUnitToPx(sl.size(), sl.sizeUnit()) # If `fillProperties` is a dict, we are serializing a marker symbol layer inside a point # pattern fill, so we act accordingly and emit the respective properties. if isinstance(fillProperties, dict): msStyleBg.gap = (fillProperties['distanceX'] + fillProperties['distanceY']) / 2 msStyleBg.angle = fillProperties['angle'] # Emit outline only if the marker has one if sl.outlineStyle() != Qt.NoPen: msOutlineSymbol = utils.serializeWellKnownMarker(markerName, False) self.msMap.symbolset.appendSymbol(msOutlineSymbol) msStyleOutline = mapscript.styleObj(self.msClass) msStyleOutline.symbolname = msOutlineSymbol.name msStyleOutline.color = utils.serializeColor(sl.borderColor()) # QGis draws a default outline of .26mm even when the width is set to zero msStyleOutline.width = utils.sizeUnitToPx(sl.outlineWidth(), sl.outlineWidthUnit()) \ if sl.outlineWidth() > 0 \ else utils.DEFAULT_OUTLINE_WIDTH msStyleOutline.size = utils.sizeUnitToPx(sl.size(), sl.sizeUnit()) # If `fillProperties` is a dict, we are serializing a marker symbol layer inside a point # pattern fill, so we act accordingly and emit the respective properties. if isinstance(fillProperties, dict): msStyleOutline.gap = (fillProperties['distanceX'] + fillProperties['distanceY']) / 2 msStyleOutline.angle = fillProperties['angle'] if sl.outlineStyle() != Qt.SolidLine: utils.setPenStylePattern(msStyleOutline, utils.serializePenStylePattern(sl))
def ShapefileLayer(mapObj, imageryShp, filters, rgb): layerObj = mapscript.layerObj(mapObj) layerObj.name = "Sentinel2Shapefile" layerObj.status = mapscript.MS_ON layerObj.type = mapscript.MS_LAYER_POLYGON layerObj.setProjection("AUTO") layerObj.data = imageryShp layerObj.setFilter(filters) classObj = mapscript.classObj(layerObj) styleObj = mapscript.styleObj(classObj) styleObj.outlinecolor = mapscript.colorObj(rgb[0], rgb[1], rgb[2])
def __init__(self,datasource,extent,layername,layerftype): #from mapscript import * import mapscript from time import time tmap = mapscript.mapObj() print "checkpoint 1" map.setSize(400,400) #ext = rectObj(-180,-90,180,90) ext = mapscript.rectObj(extent[0],extent[2],extent[1],extent[3]) # some trouble with some bad extents in my test data map.extent = ext map.units = mapscript.MS_DD # should be programmatically set lay = mapscript.layerObj(map) lay.name = "Autolayer" lay.units = mapscript.MS_DD if (layerftype == 'RASTER'): lay.data = datasource.GetDescription() else: lay.data = datasource.GetName() print lay.data lay.status = mapscript.MS_DEFAULT cls = mapscript.classObj(lay) sty = mapscript.styleObj() col = mapscript.colorObj(0,0,0) # symPoint = mapscript.symbolObj map.setSymbolSet("symbols/symbols_basic.sym") if (layerftype == 'POINT'): lay.type = mapscript.MS_LAYER_POINT sty.setSymbolByName = "achteck" sty.width = 100 sty.color = col elif (layerftype == 'LINE'): lay.type = mapscript.MS_LAYER_LINE sty.setSymbolByName = "punkt" sty.width = 5 sty.color = col elif (layerftype == 'POLYGON'): lay.type = mapscript.MS_LAYER_POLYGON sty.setSymbolByName = "circle" sty.width = 10 sty.outlinecolor = col elif (layerftype == 'RASTER'): lay.type = mapscript.MS_LAYER_RASTER sty.setSymbolByName = "squares" sty.size = 10 sty.color = col #sty.setSymbolByName(map,symname) #sty.size = symsize cls.insertStyle(sty) try: img = map.draw() img.save(str(time()) + "auto.gif") map.save(str(time()) + "auto.map") except MapServerError: return None
def testPattern4(self): """a pattern can have a max of 10 elements This is set in mapsymbol.h with #define MS_MAXPATTERNLENGTH 10""" si = mapscript.styleObj() exception = None try: si.pattern = [i for i in range(11)] except Exception: exception = True assert exception is True
def get_map_image_from_wms(wms_parameters=None, habitat_dao=None, filters=None): # Initialize mapscript map object from the habitat mapfile template. mapfile = "%s/habitat.map" % os.path.abspath(os.path.dirname(__file__)) ms_map = mapscript.mapObj(mapfile) layer = mapscript.layerObj() layer.name = "habitat" layer.setProjection('init=epsg:4326') layer.status = mapscript.MS_DEFAULT layer.setConnectionType(mapscript.MS_POSTGIS, '') connection_str = habitat_dao.get_mapserver_connection_string() layer.connection = connection_str layer.data = habitat_dao.get_mapserver_data_string(filters=filters) layer.type = mapscript.MS_LAYER_POLYGON # Create classes for types of substrates. substrate_styles= [ {'name': 'S1', 'color': '8DD3C7'}, {'name': 'S2', 'color': 'FFFFB3'}, {'name': 'S3', 'color': 'BEBADA'}, {'name': 'S4', 'color': 'FB8072'}, {'name': 'S5', 'color': '80B1D3'}, ] for ss in substrate_styles: clz = mapscript.classObj() clz.name = ss['name'] expression = "('[substrate_id]' eq '%s')" % ss['name'] clz.setExpression(expression) style = mapscript.styleObj() rgb_color = hex_to_rgb(ss['color']) style.color= mapscript.colorObj(*rgb_color) clz.insertStyle(style) layer.insertClass(clz) ms_map.insertLayer(layer) # Build WMS request from parameters. wms_request = mapscript.OWSRequest() for k, v in wms_parameters: wms_request.setParameter(k,v) # Load the parameters into the map. ms_map.loadOWSParameters(wms_request) # Draw the map. ms_image = ms_map.draw() # Return the raw image. return ms_image.getBytes()
def _get_default_style(self): styleobj = mapscript.styleObj() if self.type == 'POINT': styleobj.size = 5 styleobj.color.setHex('#ff0000') elif self.type == 'POLYGON': styleobj.color.setHex('#ffff00') else: styleobj.color.setHex('#0000ff') styleobj.width = 3 return styleobj
def _get_default_style(self): styleobj = mapscript.styleObj() if self.type == 'POINT': styleobj.size = 5 styleobj.color.setHex('#ff0000') elif self.type == 'POLYGON': styleobj.color.setHex('#ffff00') else: styleobj.color.setHex('#0000ff') styleobj.width=3 return styleobj
def testRemoveStyleAtBeginning(self): """styleObj remove first one""" self.initMap() style = mapscript.styleObj() assert style.refcount == 1, style.refcount assert style.thisown == 1, style.thisown self.map.getLayer(1).getClass(0).insertStyle(style) assert style.refcount == 2, style.refcount assert style.thisown == 1, style.thisown style = self.map.getLayer(1).getClass(0).removeStyle(0) assert style.refcount == 1, style.refcount assert style.thisown == 1, style.thisown
def _get_default_mapserver_style(self, map, new_layer): ''' Returns an array of styles based on the geomerty type of the created layer''' mapscript = self.mapscript styleobj_array = [] # Line Geometry default styling if new_layer.type == mapscript.MS_LAYER_LINE: styleobj = mapscript.styleObj() styleobj.color.setHex("#0000FF") styleobj.size = 1 styleobj_array.append(styleobj) # Polygon Geometry default styling elif new_layer.type == mapscript.MS_LAYER_POLYGON: styleobj = mapscript.styleObj() styleobj.color.setHex("#AAAAAA") styleobj.outlinecolor.setHex("#000000") styleobj.size = 1 styleobj_array.append(styleobj) # Point Geometry default styling elif new_layer.type == mapscript.MS_LAYER_POINT: styleobj = mapscript.styleObj() styleobj.color.setHex("#FF0000") styleobj.setSymbolByName(map, 'square') styleobj.size = 6 styleobj_array.append(styleobj) else: styleobj = mapscript.styleObj() styleobj.color.setHex('#0000ff') styleobj.width = 3 styleobj_array.append(styleobj) return styleobj_array
def _get_default_mapserver_style(self, map, new_layer): ''' Returns an array of styles based on the geomerty type of the created layer''' mapscript = self.mapscript styleobj_array = [] # Line Geometry default styling if new_layer.type == mapscript.MS_LAYER_LINE: styleobj = mapscript.styleObj() styleobj.color.setHex("#0000FF") styleobj.size = 1 styleobj_array.append(styleobj) # Polygon Geometry default styling elif new_layer.type == mapscript.MS_LAYER_POLYGON: styleobj = mapscript.styleObj() styleobj.color.setHex("#AAAAAA") styleobj.outlinecolor.setHex("#000000") styleobj.size = 1 styleobj_array.append(styleobj) # Point Geometry default styling elif new_layer.type == mapscript.MS_LAYER_POINT: styleobj = mapscript.styleObj() styleobj.color.setHex("#FF0000") styleobj.setSymbolByName(map, 'square') styleobj.size = 6 styleobj_array.append(styleobj) else: styleobj = mapscript.styleObj() styleobj.color.setHex('#0000ff') styleobj.width=3 styleobj_array.append(styleobj) return styleobj_array
def default_class_style(self, col_name): # return a default class for styling based on the value of a specified # column styleobj = mapscript.styleObj() styleobj.mincolor = mapscript.colorObj(255, 255, 255) styleobj.maxcolor = mapscript.colorObj(0, 128, 255) if 'min' in self._data and 'max' in self._data: styleobj.minvalue = self._data['min'] styleobj.maxvalue = self._data['max'] styleobj.rangeitem = col_name clsobj = mapscript.classObj() clsobj.name = "-" clsobj.insertStyle(styleobj) return clsobj
def addPlaneSymbol(self,position): """Adds the plane symbol at the indicated position""" pt = mapscript.pointObj() pt.x = position[0] #lat pt.y = position[1] #lon # project our point into the mapObj's projection #ddproj = mapscript.projectionObj('proj=latlong,ellps=WGS84') #http://www.mass.gov/mgis/dd-over.htm ddproj = mapscript.projectionObj('proj=lcc,ellps=GRS80') origproj = mapscript.projectionObj(self.map.getProjection()) pt.project(ddproj,origproj) # create the symbol using the image planeSymbol = mapscript.symbolObj('from_img') planeSymbol.type = mapscript.MS_SYMBOL_PIXMAP planeImg = mapscript.imageObj('images/map-plane-small.png','GD/PNG') #TODO: need to rotate plane to current heading planeSymbol.setImage(planeImg) symbol_index = self.map.symbolset.appendSymbol(planeSymbol) # create a shapeObj out of our location point so we can # add it to the map. self.routeLine = mapscript.lineObj() self.routeLine.add(pt) routeShape=mapscript.shapeObj(mapscript.MS_SHAPE_POINT) routeShape.add(self.routeLine) routeShape.setBounds() # create our inline layer that holds our location point self.planeLayer = mapscript.layerObj(None) self.planeLayer.addFeature(routeShape) self.planeLayer.setProjection(self.map.getProjection()) self.planeLayer.name = "plane" self.planeLayer.type = mapscript.MS_LAYER_POINT self.planeLayer.connectiontype=mapscript.MS_INLINE self.planeLayer.status = mapscript.MS_ON self.planeLayer.transparency = mapscript.MS_GD_ALPHA # add the image symbol we defined above to the inline layer. planeClass = mapscript.classObj(None) planeClass.name='plane' style = mapscript.styleObj(None) style.symbol = self.map.symbolset.index('from_img') planeClass.insertStyle(style) self.planeLayer.insertClass(planeClass) self.map.insertLayer(self.planeLayer) if debug: print "added plane layer, layerorder=",self.map.getLayerOrder()
def testCloneStyle(self): """styleObj Clone""" self.initMap() style = mapscript.styleObj() assert style.refcount == 1, style.refcount assert style.thisown == 1, style.thisown clone = style.clone() assert clone.refcount == 1, clone.refcount assert clone.thisown == 1, clone.thisown assert style.refcount == 1, style.refcount assert style.thisown == 1, style.thisown style = self.map.getLayer(1).getClass(0).getStyle(0) clone = style.clone() assert clone.refcount == 1, clone.refcount assert clone.thisown == 1, clone.thisown
def testAppendNewStyleOldWay(self): """NewStylesTestCase.testAppendNewStyleOldWay: a new style can be appended properly using old method""" p_layer = self.map.getLayerByName('POINT') class0 = p_layer.getClass(0) assert class0.numstyles == 2, class0.numstyles new_style = mapscript.styleObj(class0) assert new_style.thisown == 1, new_style.thisown new_style.color.setRGB(0, 0, 0) new_style.symbol = 1 new_style.size = 3 msimg = self.map.draw() filename = 'testAppendNewStyleOldWay.png' fh = open(filename, 'wb') msimg.write(fh) fh.close()
def getStyle(): style_obj = styleObj() style_obj.rangeitem = "pixel" style_obj.maxcolor = colorObj(175, 240, 233) style_obj.mincolor = colorObj(255, 255, 179) style_obj.maxvalue = 1 style_obj.minvalue = -47 clz_obj = classObj() clz_obj.setExpression("([pixel] >= -47 AND [pixel] <= 1)") clz_obj.insertStyle(style_obj) return clz_obj
def testAppendNewStyleOldWay(self): """NewStylesTestCase.testAppendNewStyleOldWay: a new style can be appended properly using old method""" p_layer = self.map.getLayerByName('POINT') class0 = p_layer.getClass(0) assert class0.numstyles == 2, class0.numstyles new_style = mapscript.styleObj(class0) assert new_style.thisown == 1, new_style.thisown new_style.color.setRGB(0, 0, 0) new_style.symbol = 1 new_style.size = 3 msimg = self.map.draw() data = msimg.saveToString() filename = 'testAppendNewStyleOldWay.png' fh = open(filename, 'wb') fh.write(data) fh.close()
def testSettingFonts(self): mo = mapscript.mapObj() assert mo.fontset.numfonts == 0 mo.fontset.fonts.set('Vera', os.path.join(TESTS_PATH, 'vera', 'Vera.ttf')) # NB: this does *not* increment the fonset.numfonts -- new bug mo.setSize(300, 300) mo.setExtent(-1.0, -1.0, 1.0, 1.0) lo = mapscript.layerObj() lo.type = mapscript.MS_LAYER_POINT lo.connectiontype = mapscript.MS_INLINE lo.status = mapscript.MS_DEFAULT co = mapscript.classObj() lbl = mapscript.labelObj() lbl.type = mapscript.MS_TRUETYPE lbl.font = 'Vera' lbl.size = 10 lbl.color.setHex('#000000') co.addLabel(lbl) so = mapscript.styleObj() so.symbol = 0 so.color.setHex('#000000') co.insertStyle(so) lo.insertClass(co) li = mo.insertLayer(lo) lo = mo.getLayer(li) point = mapscript.pointObj(0, 0) line = mapscript.lineObj() line.add(point) shape = mapscript.shapeObj(lo.type) shape.add(line) shape.setBounds() shape.text = 'Foo' shape.classindex = 0 lo.addFeature(shape) im = mo.draw() # im = mo.prepareImage() # shape.draw(mo, lo, im) im.save('testSettingFonts.png')
def testInsertNewStyleAtIndex0(self): """NewStylesTestCase.testInsertNewStyleAtIndex0: a new style can be inserted ahead of all others""" l_layer = self.map.getLayerByName('LINE') class0 = l_layer.getClass(0) new_style = mapscript.styleObj() new_style.color.setRGB(255, 255, 0) new_style.symbol = 1 new_style.size = 7 index = class0.insertStyle(new_style, 0) assert index == 0, index assert class0.numstyles == 2, class0.numstyles msimg = self.map.draw() assert msimg.thisown == 1 filename = 'testInsertNewStyleAtIndex0.png' fh = open(filename, 'wb') msimg.write(fh) fh.close()
def get_pg_layer(data, name, group, connection, query_filter=None, crs=None, fill_color=None, out_color=None, opacity=None): """ Mapscript Layer для векторных данных, хранящихся в Postgres. """ layer = mapscript.layerObj() layer.type = mapscript.MS_LAYER_POLYGON layer.status = mapscript.MS_ON # mapscript.MS_DEFAULT layer.name = name layer.group = group layer.setProjection('EPSG:4326') layer.metadata.set('wms_srs', 'EPSG:4326') layer.metadata.set('wms_title', name) layer.connectiontype = mapscript.MS_POSTGIS layer.connection = connection layer.data = data # "geom from data" # status = layer.setFilter(query_filter) # "id = 123" # layer.setExtent({'minx': 3, 'miny': 3, 'maxx': 3, 'maxy': 3}) # layer.setExtent(1, 2, 3, 4) # layer.setProjection('EPSG:4326') # layer.setProcessing("SCALE=0,255") # layer.setProcessing("DITHER=YES") # layer.setProcessing("RESAMPLE=BILINEAR") # BILINEAR, AVERAGE, NEAREST # layer.setProcessing("EXTENT_PRIORITY=WORLD") # layer.setProcessing("LOAD_FULL_RES_IMAGE=NO") # layer.setProcessing("LOAD_WHOLE_IMAGE=NO") c = mapscript.classObj(layer) style = mapscript.styleObj(c) if fill_color: fill_color = mapscript.colorObj(*fill_color) style.color = fill_color if out_color: out_color = mapscript.colorObj(*out_color) style.outlinecolor = out_color if opacity: # style.opacity = opacity layer.opacity = opacity return layer
def testPointDraw(self): """Can create a point, add to a layer, and draw it directly""" map_string = """ MAP EXTENT 0 0 90 90 SIZE 500 500 SYMBOL NAME "circle" TYPE ELLIPSE POINTS 1 1 END FILLED true END LAYER NAME "punkt" STATUS ON TYPE POINT END END""" test_map = mapscript.fromstring(map_string) layer = test_map.getLayerByName('punkt') cls = mapscript.classObj() style = mapscript.styleObj() style.outlinecolor.setHex('#00aa00ff') style.size = 10 style.setSymbolByName(test_map, 'circle') cls.insertStyle(style) class_idx = layer.insertClass(cls) point = mapscript.pointObj(45, 45) img = test_map.prepareImage() point.draw(test_map, layer, img, class_idx, "test") filename = 'testDrawPoint.png' with open(filename, 'wb') as fh: img.write(fh) if have_image: pyimg = Image.open(filename) assert pyimg.size == (500, 500)
def serializeSvgMarkerSymbolLayer(self, sl): """Serialize a QGis SVG marker symbol layer into a MapServer style """ try: msSymbol = utils.serializeSvgSymbol(unicode(sl.path()).encode('utf-8')) except Exception as e: QgsMessageLog.logMessage( u'Cannot serialize SVG symbol: %s' % unicode(e), 'RT MapServer Exporter' ) return self.msMap.symbolset.appendSymbol(msSymbol) msStyle = mapscript.styleObj(self.msClass) msStyle.symbolname = msSymbol.name msStyle.size = utils.sizeUnitToPx(sl.size(), sl.sizeUnit())
def testAppendNewStyle(self): """a new style can be appended properly""" p_layer = self.map.getLayerByName('POINT') class0 = p_layer.getClass(0) assert class0.numstyles == 2, class0.numstyles new_style = mapscript.styleObj() new_style.color.setRGB(0, 0, 0) new_style.setSymbolByName(self.map, 'circle') new_style.size = 3 index = class0.insertStyle(new_style) assert index == 2, index assert class0.numstyles == 3, class0.numstyles msimg = self.map.draw() assert msimg.thisown == 1 filename = 'testAppendNewStyle.png' fh = open(filename, 'wb') msimg.write(fh) fh.close()
def testInsertNewStyleAtIndex0(self): """NewStylesTestCase.testInsertNewStyleAtIndex0: a new style can be inserted ahead of all others""" l_layer = self.map.getLayerByName('LINE') class0 = l_layer.getClass(0) new_style = mapscript.styleObj() new_style.color.setRGB(255, 255, 0) new_style.symbol = 1 new_style.size = 7 index = class0.insertStyle(new_style, 0) assert index == 0, index assert class0.numstyles == 2, class0.numstyles msimg = self.map.draw() assert msimg.thisown == 1 data = msimg.saveToString() filename = 'testInsertNewStyleAtIndex0.png' fh = open(filename, 'wb') fh.write(data) fh.close()
def get_color_class(attr=None, cmin=None, cmax=None, hsv=None): clz = mapscript.classObj() clz.name = "{} to {}".format(cmin, cmax) style = mapscript.styleObj() rgb = [int(c) for c in colorsys.hsv_to_rgb(*hsv)] style.color= mapscript.colorObj(*rgb) clz.insertStyle(style) criteria = [] if cmin != None: criteria.append("[{}] >= {}".format(attr, cmin)) if cmax != None: criteria.append("[{}] < {}".format(attr, cmax)) if criteria: expression = "({})".format(' AND '.join(criteria)) clz.setExpression(expression) return clz
def _add_north_arrow(self, msmap, map_height): north_arrow_layer = mapscript.layerObj() north_arrow_layer.transform = False north_arrow_layer.name = 'north_arrow' north_arrow_layer.type = mapscript.MS_LAYER_POINT north_arrow_layer.status = 1 new_class = mapscript.classObj() new_style = mapscript.styleObj() new_style.setSymbolByName(msmap, 'northarrow1') li = msmap.insertLayer(north_arrow_layer) ci = msmap.getLayer(li).insertClass(new_class) si = msmap.getLayer(li).getClass(ci).insertStyle(new_style) point = mapscript.pointObj() #place north arrow at the bottom of the image: point.x = 30 point.y = map_height-30 north_arrow_layer.addFeature(point.toShape())