📄 ms_export.py
字号:
opacity = int ( 100.0 * float(lyr.getElementsByTagName("transparencyLevelInt")[0].childNodes[0].nodeValue.encode('utf-8')) / 255.0 ) self.outFile.write(" TRANSPARENCY " + str(opacity) + "\n") self.outFile.write(" PROJECTION\n") # Get the destination srs for this layer and use it to create # the projection section destsrs = self.qgs.getElementsByTagName("destinationsrs")[0] proj4Text = destsrs.getElementsByTagName("proj4")[0].childNodes[0].nodeValue.encode('utf-8') # the proj4 text string needs to be reformatted to make mapserver happy self.outFile.write(self.formatProj4(proj4Text)) self.outFile.write(" END\n") scaleDependent = lyr.getAttribute("scaleBasedVisibilityFlag").encode('utf-8') if scaleDependent == '1': # get the min and max scale settings minscale = lyr.getAttribute("minScale").encode('utf-8') maxscale = lyr.getAttribute("maxScale").encode('utf-8') if minscale > '': self.outFile.write(" MINSCALE " + minscale + "\n") if maxscale > '': self.outFile.write(" MAXSCALE " + maxscale + "\n") # Check for label field (ie LABELITEM) and label status try: labelOn = lyr.getElementsByTagName( "label")[0].childNodes[0].nodeValue.encode('utf-8') labelField = lyr.getElementsByTagName("labelfield")[0].childNodes[0].nodeValue.encode('utf-8') if labelField != '' and labelField is not None and labelOn == "1": self.outFile.write(" LABELITEM '" + labelField + "'\n"); except: # no labels pass # write the CLASS section for rendering # First see if there is a single symbol renderer if lyr.getElementsByTagName("singlesymbol").length > 0: symbolNode = lyr.getElementsByTagName("singlesymbol")[0].getElementsByTagName('symbol')[0] self.simpleRenderer(lyr, symbolNode) elif lyr.getElementsByTagName("graduatedsymbol").length > 0: self.graduatedRenderer(lyr, lyr.getElementsByTagName("graduatedsymbol")[0].getElementsByTagName('symbol')[0] ) elif lyr.getElementsByTagName("continuoussymbol").length > 0: self.continuousRenderer(lyr, lyr.getElementsByTagName("continuoussymbol")[0] ) elif lyr.getElementsByTagName("uniquevalue").length > 0: self.uniqueRenderer(lyr, lyr.getElementsByTagName("uniquevalue")[0].getElementsByTagName('symbol')[0] ) # end of LAYER self.outFile.write(" END\n\n") # Simple renderer ouput # We need the layer node and symbol node def simpleRenderer(self, layerNode, symbolNode): # get the layers geometry type geometry = layerNode.getAttribute("geometry").encode('utf-8').upper() self.outFile.write(" CLASS\n") self.outFile.write(" NAME '" + layerNode.getElementsByTagName("layername")[0].childNodes[0].nodeValue.encode('utf-8').replace("\"", "") + "' \n") self.outFile.write(" STYLE\n") # use the point symbol map to lookup the mapserver symbol type symbol = self.msSymbol( geometry, symbolNode ) self.outFile.write(" SYMBOL " + symbol + " \n") self.outFile.write(" SIZE " + symbolNode.getElementsByTagName('pointsize')[0].childNodes[0].nodeValue.encode('utf-8') + " \n") # outline color outlineNode = symbolNode.getElementsByTagName('outlinecolor')[0] self.outFile.write(" OUTLINECOLOR " + outlineNode.getAttribute('red') + ' ' + outlineNode.getAttribute('green') + ' ' + outlineNode.getAttribute('blue') + "\n") # color colorNode = symbolNode.getElementsByTagName('fillcolor')[0] self.outFile.write(" COLOR " + colorNode.getAttribute('red') + ' ' + colorNode.getAttribute('green') + ' ' + colorNode.getAttribute('blue') + "\n") self.outFile.write(" END\n") self.outFile.write( self.msLabel( layerNode ) ) # end of CLASS self.outFile.write(" END\n") # Graduated symbol renderer output def graduatedRenderer(self, layerNode, symbolNode): # get the layers geometry type geometry = layerNode.getAttribute("geometry").encode('utf-8').upper() # get the renderer field for building up the classes classField = layerNode.getElementsByTagName('classificationattribute')[0].childNodes[0].nodeValue.encode('utf-8') # write the render item self.outFile.write(" CLASSITEM '" + classField + "'\n") # write the rendering info for each class classes = layerNode.getElementsByTagName('symbol') for cls in classes: self.outFile.write(" CLASS\n") lower = cls.getElementsByTagName('lowervalue')[0].childNodes[0].nodeValue.encode('utf-8') upper = cls.getElementsByTagName('uppervalue')[0].childNodes[0].nodeValue.encode('utf-8') # If there's a label use it, otherwise autogenerate one try: label = cls.getElementsByTagName('label')[0].childNodes[0].nodeValue.encode('utf-8') self.outFile.write(" NAME '" + label + "'\n") except: self.outFile.write(" NAME '" + lower + " < " + classField + " < " + upper + "'\n") self.outFile.write(" EXPRESSION ( ([" + classField + "] >= " + lower + ") AND ([" + classField + "] <= " + upper + ") )\n") self.outFile.write(" STYLE\n") symbol = self.msSymbol( geometry, symbolNode ) self.outFile.write(" SYMBOL " + symbol + "\n") # Symbol size if geometry == 'POINT' or geometry == 'LINE': self.outFile.write(" SIZE " + cls.getElementsByTagName('pointsize')[0].childNodes[0].nodeValue.encode('utf-8') + " \n") # outline color outlineNode = cls.getElementsByTagName('outlinecolor')[0] self.outFile.write(" OUTLINECOLOR " + outlineNode.getAttribute('red') + ' ' + outlineNode.getAttribute('green') + ' ' + outlineNode.getAttribute('blue') + "\n") # color colorNode = cls.getElementsByTagName('fillcolor')[0] self.outFile.write(" COLOR " + colorNode.getAttribute('red') + ' ' + colorNode.getAttribute('green') + ' ' + colorNode.getAttribute('blue') + "\n") self.outFile.write(" END\n") # label self.outFile.write( self.msLabel( layerNode ) ) # end of CLASS self.outFile.write(" END\n") # Continuous symbol renderer output def continuousRenderer(self, layerNode, symbolNode): # get the layers geometry type geometry = layerNode.getAttribute("geometry").encode('utf-8').upper() # get the renderer field for building up the classes classField = layerNode.getElementsByTagName('classificationattribute')[0].childNodes[0].nodeValue.encode('utf-8') # write the rendering info for each class self.outFile.write(" CLASS\n") # Class name irrelevant for color ramps since mapserver can't render their legend #self.outFile.write(" NAME '" + classField + "'\n") # color lower = symbolNode.getElementsByTagName('lowestsymbol')[0].getElementsByTagName('symbol')[0] upper = symbolNode.getElementsByTagName('highestsymbol')[0].getElementsByTagName('symbol')[0] lowerColor = lower.getElementsByTagName('fillcolor')[0] upperColor = upper.getElementsByTagName('fillcolor')[0] # outline color outlineNode = lower.getElementsByTagName('outlinecolor')[0] self.outFile.write(" STYLE\n") # The first and last color of the ramp ( r g b r g b ) self.outFile.write(" COLORRANGE " + lowerColor.getAttribute('red') + " " + lowerColor.getAttribute('green') + " " + lowerColor.getAttribute('blue') + " " + upperColor.getAttribute('red') + " " + upperColor.getAttribute('green') + " " + upperColor.getAttribute('blue') + "\n") # The range of values over which to ramp the colors self.outFile.write(" DATARANGE " + lower.getElementsByTagName('lowervalue')[0].childNodes[0].nodeValue.encode('utf-8') + ' ' + upper.getElementsByTagName('lowervalue')[0].childNodes[0].nodeValue.encode('utf-8') + '\n') self.outFile.write(" RANGEITEM '" + classField + "'\n") self.outFile.write(" END\n") self.outFile.write(" STYLE\n") self.outFile.write(" OUTLINECOLOR " + outlineNode.getAttribute('red') + " " + outlineNode.getAttribute('green') + " " + outlineNode.getAttribute('blue') + "\n") self.outFile.write(" END\n") # label self.outFile.write( self.msLabel( layerNode )) # end of CLASS self.outFile.write(" END\n") # Unique value renderer output def uniqueRenderer(self, layerNode, symbolNode): # get the renderer field for building up the classes classField = layerNode.getElementsByTagName('classificationattribute')[0].childNodes[0].nodeValue.encode('utf-8') # get the layers geometry type geometry = layerNode.getAttribute("geometry").encode('utf-8').upper() # write the render item self.outFile.write(" CLASSITEM '" + classField + "'\n") # write the rendering info for each class classes = layerNode.getElementsByTagName('symbol') for cls in classes: self.outFile.write(" CLASS\n") try: lower = cls.getElementsByTagName('lowervalue')[0].childNodes[0].nodeValue.encode('utf-8') except IndexError: # set to blank in the case where the field used for rendering has no value lower = "" # If there's a label use it, otherwise autogenerate one try: label = cls.getElementsByTagName('label')[0].childNodes[0].nodeValue.encode('utf-8') self.outFile.write(" NAME '" + label + "'\n") except: self.outFile.write(" NAME '" + classField + " = " + lower + "' \n") self.outFile.write(" EXPRESSION '" + lower + "' \n") # Get the symbol name symbol = self.msSymbol( geometry, symbolNode ) self.outFile.write(" STYLE\n") self.outFile.write(" SYMBOL " + symbol + "\n") # Symbol size if geometry == 'POINT' or geometry == 'LINE': self.outFile.write(" SIZE " + cls.getElementsByTagName('pointsize')[0].childNodes[0].nodeValue.encode('utf-8') + " \n") # outline color outlineNode = cls.getElementsByTagName('outlinecolor')[0] self.outFile.write(" OUTLINECOLOR " + outlineNode.getAttribute('red') + ' ' + outlineNode.getAttribute('green') + ' ' + outlineNode.getAttribute('blue') + "\n") # color colorNode = cls.getElementsByTagName('fillcolor')[0] self.outFile.write(" COLOR " + colorNode.getAttribute('red') + ' ' + colorNode.getAttribute('green') + ' ' + colorNode.getAttribute('blue') + "\n") self.outFile.write(" END\n") # label self.outFile.write( self.msLabel( layerNode )) # end of CLASS self.outFile.write(" END\n") # Utility method to format a proj4 text string into mapserver format def formatProj4(self, proj4text): parms = proj4text.split(" ") ret = "" for p in parms: p = p.replace("+","") ret = ret + " '" + p + "'\n" return ret # Determines the symbol name and adds it to the symbol queue def msSymbol(self, geometry, symbolNode): # contains the same markup for a layer regardless of type # so we infer a symbol type based on the geometry symbolName = '' symbol = '0' if geometry == 'POLYGON': symbol = '0' elif geometry == 'LINE': symbol = '0' elif geometry == 'POINT': try: symbolName = qgisSymbols[symbolNode.getElementsByTagName('pointsymbol')[0].childNodes[0].nodeValue.encode('utf-8')] except: symbolName = "CIRCLE" # make sure it's single quoted symbol = "'" + symbolName + "'" if symbolName == 'CIRCLE': self.symbolQueue['CIRCLE'] = """ #Circle symbol SYMBOL NAME 'CIRCLE' TYPE ellipse FILLED true POINTS 1 1 END END """ if symbolName == 'TRIANGLE': self.symbolQueue['TRIANGLE'] = """ SYMBOL NAME "TRIANGLE" TYPE vector FILLED true POINTS 0 1 .5 0 1 1 0 1 END END """ return symbol # Label block creation # TODO field-based parameters, alignment, truetype fonts, sizes def msLabel(self, layerNode): # currently a very basic bitmap font labelNode = layerNode.getElementsByTagName('labelattributes')[0] labelField = labelNode.getElementsByTagName('label')[0].getAttribute('field').encode('utf-8') if labelField != '' and labelField is not None: labelBlock = " LABEL \n" labelBlock += " SIZE medium\n" labelBlock += " COLOR 0 0 0 \n" # Include label angle if specified # Note that angles only work for truetype fonts which aren't supported yet angle = labelNode.getElementsByTagName('angle')[0].getAttribute('value').encode('utf-8') labelBlock += " ANGLE " + angle + "\n" # Include label buffer if specified # Note that the buffer has different meaning in qgis vs mapserver # mapserver just adds blank space around the label while # qgis uses a fill color around the label # Note that buffer only works for truetype fonts which aren't supported yet buffer = labelNode.getElementsByTagName('buffersize')[0].getAttribute('value').encode('utf-8') labelBlock += " BUFFER " + buffer + "\n" labelBlock += " END \n" return labelBlock else: return ''
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -