⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ms_export.py

📁 一个非常好的GIS开源新版本
💻 PY
📖 第 1 页 / 共 2 页
字号:
      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 + -