Identifikace rasterizujících vrstev pomocí Pythonu

19. 12. 2011
  • Desktopový GIS
  • Další
  • ArcGIS 10.0
  • ArcGIS 10.1
  • ArcGIS 10.2
  • ArcGIS 10.3

S problémem rasterizace se nejčastěji setkáme u rozsáhlých mapových projektů s velkým počtem vrstev, které mohou obsahovat nestandardní symbologii, bitmapové značky nebo průhlednost. Pokud je nastaven některý z těchto faktorů u libovolné vrstvy v mapovém projektu, po exportu (nebo tisku) mapového dokumentu dojde k rasterizaci výstupu (ta je aplikována jak na dotyčnou vrstvu, tak i na všechny ostatní vrstvy, které v tabulce obsahu leží pod ní).

Rasterizaci lze odstranit následujícími postupy:

  • Vypnutím nebo přesunutím všech vrstev způsobujících rasterizaci do spodní části tabulky obsahu v aplikaci ArcMap. (Tak budou rasterizovány pouze vrstvy, které rasterizaci vyžadují.)
  • Změnou symbologie (např. BMP nahradit za EMF symboly) a eliminací průhlednosti u jednotlivých vrstev.

Pro oba dva přístupy je ovšem klíčová samotná úloha identifikace vrstev způsobujících rasterizaci. V aplikaci ArcGIS Desktop 10 můžeme k řešení této úlohy využít následující python skript, který lze spustit přímo z integrovaného okna Python v aplikaci ArcMap. Po identifikaci vrstev následně můžeme aplikovat jeden z výše zmíněných postupů (nebo jejich kombinaci), abychom zabránili nechtěné rasterizaci výstupní mapy.

def DetectRasterization():
    mxd = arcpy.mapping.MapDocument("CURRENT")
    df_list = arcpy.mapping.ListDataFrames(mxd)
    foundRasterization = False
    noneFoundMsg = "Nebyly detekovany zadne vrstvy zpusobujici rasterizaci."
    for df in df_list:
        lyr_list = arcpy.mapping.ListLayers(mxd, data_frame=df)
        for lyr in lyr_list:
            if lyr.isRasterizingLayer or lyr.supports("BRIGHTNESS"):
                foundRasterization = True
                if lyr.isGroupLayer and lyr.transparency > 0:
                    print "V datovem ramci '" + df.name + "', skupina vrstvy '" + \
                                lyr.longName + "' je vrstvou zpusobujici rasterizaci:\r",
                    print "\tViditelnost je " + str(lyr.visible) + ".\n" + \
                            "\tPruhlednost je " + str(lyr.transparency) + " procent.\n"
                elif not lyr.isGroupLayer:
                    print "V datovem ramci '" + df.name + "', je vrstva '" + \
                                lyr.longName + "' zpusobujici rasterizaci:\r",
                    if lyr.transparency > 0:
                        print "\tViditelnost je " + str(lyr.visible) + ".\n" + \
                                "\tPruhlednost je " + str(lyr.transparency) + " procent.\n"
                    else:
                        print "\tViditelnost je " + str(lyr.visible) + ".\n" + \
                                "\tPruhlednost je 0 procent, ale vrstva muze byt \n" + \
                                "\trastrova nebo obsahovat symboly zpusobujici rasterizaci, jako \n" + \
                                "\tjsou bitmapove znacky.\n"
            del lyr
        del lyr_list
        del df
    if not foundRasterization:
        print noneFoundMsg
    del df_list
    del mxd
DetectRasterization()