예제 #1
0
def createScreenOverlaysForKML(kml,logofile,logodims,logounits):
    screen1 = kml.newscreenoverlay(name='Colorbar')
    screen1.icon.href = fileTypesColorBarNames[filetype]
    screen1.overlayxy = simplekml.OverlayXY(x=0,y=0,xunits=simplekml.Units.fraction,
                                     yunits=simplekml.Units.fraction)
    screen1.screenxy = simplekml.ScreenXY(x=0,y=0.1,xunits=simplekml.Units.fraction,
                                     yunits=simplekml.Units.fraction)
    screen1.size.x = 0.1
    screen1.size.y = 0.72
    screen1.size.xunits = simplekml.Units.fraction
    screen1.size.yunits = simplekml.Units.fraction

    if logofile != 'null' and logofile != 'none': 
        screen2 = kml.newscreenoverlay(name='logo')
        screen2.icon.href = logofile
        screen2.overlayxy = simplekml.OverlayXY(x=0,y=1,xunits=simplekml.Units.fraction,
                                       yunits=simplekml.Units.fraction)
        screen2.screenxy = simplekml.ScreenXY(x=0,y=1,xunits=simplekml.Units.fraction,
                                        yunits=simplekml.Units.fraction)
        if logounits == 'fraction':     
            screen2.size.xunits = simplekml.Units.fraction
            screen2.size.yunits = simplekml.Units.fraction
        if logounits == 'pixel':
            screen2.size.xunits = simplekml.Units.pixel
            screen2.size.yunits = simplekml.Units.pixel
        if logodims == 'null':
            screen2.size.x = 0.85
            screen2.size.y = 0.08
        else:
            a = logodims.split(" ")
            screen2.size.x = float(a[0])
            screen2.size.y = float(a[1])
예제 #2
0
def place_legend(datadir, document):
    """Place the ShakeMap intensity legend in the upper left corner of
    the viewer's map.

    Args:
        datadir (str): Path to data directory where output KMZ will be written.
        document (Element): LXML KML Document element.

    Returns:
        str: Path to output intensity legend file.
    """
    icon = skml.Icon(href=LEGEND)
    overlayxy = skml.OverlayXY(x=0, y=90, xunits='pixels', yunits='pixels')
    screenxy = skml.ScreenXY(x=5, y=1, xunits='pixels', yunits='fraction')
    size = skml.Size(x=0, y=0, xunits='pixels', yunits='pixels')
    document.newscreenoverlay(name='Intensity Legend', icon=icon,
                              overlayxy=overlayxy,
                              screenxy=screenxy,
                              size=size)

    # we need to find the legend file and copy it to
    # the output directory
    this_dir, _ = os.path.split(__file__)
    data_path = os.path.join(this_dir, '..', 'data', 'mapping')
    legend_file = os.path.join(data_path, LEGEND)
    legdest = os.path.join(datadir, LEGEND)
    shutil.copyfile(legend_file, legdest)
    return legdest
    def PlotOverlayImg(self, filepath, xpixel, ypixel, name="ScreenOverlay"):
        """
        filepath: file path
        xpixel
        ypixel
        name (option)
        """
        print "[PlotOverlayImg] plotting image file:" + filepath + ",xpixel:" + str(
            xpixel) + ",ypixel" + str(ypixel)

        screen = self.kml.newscreenoverlay(name=name)
        screen.icon.href = filepath
        screen.overlayxy = simplekml.OverlayXY(x=0,
                                               y=0,
                                               xunits=simplekml.Units.fraction,
                                               yunits=simplekml.Units.fraction)
        screen.screenxy = simplekml.ScreenXY(
            x=xpixel,
            y=ypixel,
            xunits=simplekml.Units.pixel,
            yunits=simplekml.Units.insetpixels)
        screen.size.x = -1
        screen.size.y = -1
        screen.size.xunits = simplekml.Units.fraction
        screen.size.yunits = simplekml.Units.fraction
예제 #4
0
def make_screen(the_kml):
    # add the screen
    # make screen
    screen = the_kml.newscreenoverlay(name='Legende')

    screen.icon.href = 'files/color_ramp.png'
    screen.icon.scale = 0.01

    screen.overlayxy = simplekml.OverlayXY(x=0,
                                           y=1,
                                           xunits=simplekml.Units.fraction,
                                           yunits=simplekml.Units.fraction)
    screen.screenxy = simplekml.ScreenXY(
        x=150,
        y=15,
        xunits=simplekml.Units.pixel,
        yunits=simplekml.Units.insetpixels,
    )
    screen.size.x = 0.36
    screen.size.y = 0.08
    screen.size.xunits = simplekml.Units.fraction
    screen.size.yunits = simplekml.Units.fraction

    # make second screen
    screen_2 = the_kml.newscreenoverlay(name='Logo')

    screen_2.icon.href = 'files/logo.png'
    screen_2.icon.scale = 0.01

    screen_2.overlayxy = simplekml.OverlayXY(x=0,
                                             y=1,
                                             xunits=simplekml.Units.fraction,
                                             yunits=simplekml.Units.fraction)
    screen_2.screenxy = simplekml.ScreenXY(
        x=15,
        y=15,
        xunits=simplekml.Units.pixel,
        yunits=simplekml.Units.insetpixels,
    )
    screen_2.size.x = 0.1
    screen_2.size.y = 0.1
    screen_2.size.xunits = simplekml.Units.fraction
    screen_2.size.yunits = simplekml.Units.fraction
예제 #5
0
def setup_legend(screen):
    screen.overlayxy = simplekml.OverlayXY(x=0,
                                           y=0.5,
                                           xunits=simplekml.Units.fraction,
                                           yunits=simplekml.Units.fraction)
    screen.screenxy = simplekml.ScreenXY(x=10,
                                         y=0.5,
                                         xunits=simplekml.Units.pixel,
                                         yunits=simplekml.Units.fraction)
    '''
예제 #6
0
    def _scalar2kmz(self, d, var, tndx, out_path, cleanup=True):
        """
        Postprocess a single raster variable ``fa`` and store result in out_path.

        :param d: the open netCDF file
        :param var: the variable name
        :param tndx: the temporal index of the grid to store
        :param out_path: the path to the KMZ output
        :param cleanup: if true, delete png files
        :return: the path to the generated KMZ
        """
        # construct kml file
        doc = kml.Kml(name=var)

        # generate the png files
        raster_path, cb_path, corner_coords = self._scalar2png(
            d, var, tndx, out_path)

        # add colorbar to KMZ
        if cb_path is not None:
            cbo = doc.newscreenoverlay(name='colorbar')
            cbo.overlayxy = kml.OverlayXY(x=0,
                                          y=1,
                                          xunits=kml.Units.fraction,
                                          yunits=kml.Units.fraction)
            cbo.screenxy = kml.ScreenXY(x=0.02,
                                        y=0.95,
                                        xunits=kml.Units.fraction,
                                        yunits=kml.Units.fraction)
            cbo.size = kml.Size(x=150,
                                y=300,
                                xunits=kml.Units.pixel,
                                yunits=kml.Units.pixel)
            cbo.color = kml.Color.rgb(255, 255, 255, a=150)
            cbo.visibility = 1
            #doc.addfile(cb_path)
            cbo.icon.href = cb_path

        # add ground overlay
        ground = doc.newgroundoverlay(name=var, color='80ffffff')
        ground.gxlatlonquad.coords = corner_coords
        #doc.addfile(raster_path)
        ground.icon.href = raster_path

        # build output file
        kmz_path = out_path + ".kmz"
        doc.savekmz(kmz_path)

        # cleanup
        if cleanup:
            os.remove(raster_path)
            if cb_path is not None:
                os.remove(cb_path)

        return kmz_path, raster_path, cb_path, corner_coords
예제 #7
0
def screen(kml):
    screen1 = kml.newscreenoverlay(name='Colorbar')
    if filechoice == 2:
        screen1.icon.href = 'Colorbar-water-levels.png'
    elif filechoice == 4:
        screen1.icon.href = 'Colorbar-wave-heights.png'
    elif filechoice == 8:
        screen1.icon.href = 'Colorbar-wave-periods.png'
    elif filechoice == 3:
        screen1.icon.href = 'CColorbar-wave-periods.png'
    elif filechoice == 1:
        screen1.icon.href = 'Colorbar-bathymetry.png'
    screen1.overlayxy = simplekml.OverlayXY(x=0,
                                            y=0,
                                            xunits=simplekml.Units.fraction,
                                            yunits=simplekml.Units.fraction)
    screen1.screenxy = simplekml.ScreenXY(x=0,
                                          y=0.1,
                                          xunits=simplekml.Units.fraction,
                                          yunits=simplekml.Units.fraction)
    screen1.size.x = 0.1
    screen1.size.y = 0.72
    screen1.size.xunits = simplekml.Units.fraction
    screen1.size.yunits = simplekml.Units.fraction
    screen2 = kml.newscreenoverlay(name='logo')
    screen2.icon.href = 'logo.png'
    screen2.overlayxy = simplekml.OverlayXY(x=0,
                                            y=1,
                                            xunits=simplekml.Units.fraction,
                                            yunits=simplekml.Units.fraction)
    screen2.screenxy = simplekml.ScreenXY(x=0,
                                          y=1,
                                          xunits=simplekml.Units.fraction,
                                          yunits=simplekml.Units.fraction)
    screen2.size.x = 0.85
    screen2.size.y = 0.08
    screen2.size.xunits = simplekml.Units.fraction
    screen2.size.yunits = simplekml.Units.fraction
    print 'Screen Overlay completed'
예제 #8
0
    def chart_legend(self, legend_figure):
        """
        Add overlay legend in top left corner

        :param legend_figure: path to figure
        :return: kml-object
        """
        # NOT YET TESTED
        screen = self.newscreenoverlay(name='Legend')

        # TODO: automatically make figure of legend

        screen.icon.href = legend_figure
        screen.overlayxy = simplekml.OverlayXY(x=0, y=1, xunits=simplekml.Units.fraction,
                                               yunits=simplekml.Units.fraction)
        screen.screenxy = simplekml.ScreenXY(x=15, y=15, xunits=simplekml.Units.insetpixels,
                                             yunits=simplekml.Units.insetpixels)
        screen.size.x = -1
        screen.size.y = -1
        screen.size.xunits = simplekml.Units.fraction
        screen.size.yunits = simplekml.Units.fraction
        return screen
예제 #9
0
def create_kmz(maplayer, outfile, mask=None, levels=None, colorlist=None):
    """
    Create kmz files of models

    Args:
        maplayer (dict): Dictionary of one model result formatted like:

            .. code-block:: python

                {
                    'grid': mapio grid2D object,
                    'label': 'label for colorbar and top line of subtitle',
                    'type': 'output or input to model',
                    'description': 'description for subtitle'
                }
        outfile (str): File extension
        mask (float): make all cells below this value transparent
        levels (array): list of bin edges for each color, must be same length
        colorlist (array): list of colors for each bin, should be length one less than levels

    Returns:
        kmz file
    """
    # Figure out lims
    if levels is None:
        levels = DFBINS
    if colorlist is None:
        colorlist = DFCOLORS

    if len(levels)-1 != len(colorlist):
        raise Exception('len(levels) must be one longer than len(colorlist)')

    # Make place to put temporary files
    temploc = tempfile.TemporaryDirectory()

    # Figure out file names
    name, ext = os.path.splitext(outfile)
    basename = os.path.basename(name)
    if ext != '.kmz':
        ext = '.kmz'
    filename = '%s%s' % (name, ext)
    mapfile = os.path.join(temploc.name, '%s.tiff' % basename)
    legshort = '%s_legend.png' % basename
    legfile = os.path.join(temploc.name, legshort)

    # Make colored geotiff
    out = make_rgba(maplayer['grid'], mask=mask,
                    levels=levels, colorlist=colorlist)
    rgba_img, extent, lmin, lmax, cmap = out
    # Save as a tiff
    plt.imsave(mapfile, rgba_img, vmin=lmin, vmax=lmax, cmap=cmap)

    # Start creating kmz
    L = simplekml.Kml()

    # Set zoom window
    doc = L.document  # have to put lookat in root document directory
    doc.altitudemode = simplekml.AltitudeMode.relativetoground
    boundaries1 = get_zoomextent(maplayer['grid'])
    doc.lookat.latitude = np.mean([boundaries1['ymin'], boundaries1['ymax']])
    doc.lookat.longitude = np.mean([boundaries1['xmax'], boundaries1['xmin']])
    doc.lookat.altitude = 0.
    doc.lookat.range = (boundaries1['ymax']-boundaries1['ymin']) * 111. * 1000.  # dist in m from point
    doc.description = 'USGS near-real-time earthquake-triggered %s model for \
                       event id %s' % (maplayer['description']['parameters'] \
                       ['modeltype'], maplayer['description']['event_id'])

    prob = L.newgroundoverlay(name=maplayer['label'])
    prob.icon.href = 'files/%s.tiff' % basename
    prob.latlonbox.north = extent[3]
    prob.latlonbox.south = extent[2]
    prob.latlonbox.east = extent[1]
    prob.latlonbox.west = extent[0]
    L.addfile(mapfile)

    # Add legend and USGS icon as screen overlays
    # Make legend
    make_legend(levels, colorlist, filename=legfile, title=maplayer['label'])

    size1 = simplekml.Size(x=0.3, xunits=simplekml.Units.fraction)
    leg = L.newscreenoverlay(name='Legend', size=size1)
    leg.icon.href = 'files/%s' % legshort
    leg.screenxy = simplekml.ScreenXY(x=0.2, y=0.05, xunits=simplekml.Units.fraction,
                                      yunits=simplekml.Units.fraction)
    L.addfile(legfile)

    size2 = simplekml.Size(x=0.15, xunits=simplekml.Units.fraction)
    icon = L.newscreenoverlay(name='USGS', size=size2)
    icon.icon.href = 'files/USGS_ID_white.png'
    icon.screenxy = simplekml.ScreenXY(x=0.8, y=0.95, xunits=simplekml.Units.fraction,
                                       yunits=simplekml.Units.fraction)
    L.addfile(os.path.join(os.path.dirname(os.path.abspath(__file__)),
                           os.pardir, 'content', 'USGS_ID_white.png'))

    L.savekmz(filename)
    return filename
예제 #10
0
def sendLogos():
    if checkPing(getLGIp()):
        millis = int(round(time.time() * 1000))

        kml = simplekml.Kml(name="Layout")
        screen = kml.newscreenoverlay(name='FLOYBD')
        screen.icon.href = "http://"+getDjangoIp()+":8000/static/img/ownLogos.png?a="+str(millis)
        screen.overlayxy = simplekml.OverlayXY(x=0.0, y=1.0, xunits=simplekml.Units.fraction,
                                               yunits=simplekml.Units.fraction)
        screen.screenxy = simplekml.ScreenXY(x=0.0, y=1.0, xunits=simplekml.Units.fraction,
                                             yunits=simplekml.Units.fraction)
        screen.rotationxy = simplekml.RotationXY(x=0.0, y=0.0, xunits=simplekml.Units.fraction,
                                                 yunits=simplekml.Units.fraction)
        screen.size.x = 0.20
        screen.size.y = 0.15
        screen.size.xunits = simplekml.Units.fraction
        screen.size.yunits = simplekml.Units.fraction

        screenName = kml.newscreenoverlay(name='App name')
        screenName.icon.href = "http://" + getDjangoIp() + ":8000/static/img/FlOYBDLogo.png?a=" + str(millis)
        screenName.overlayxy = simplekml.OverlayXY(x=0.0, y=1.0, xunits=simplekml.Units.fraction,
                                                   yunits=simplekml.Units.fraction)
        screenName.screenxy = simplekml.ScreenXY(x=0.3, y=0.95, xunits=simplekml.Units.fraction,
                                                 yunits=simplekml.Units.fraction)
        screenName.rotationxy = simplekml.RotationXY(x=0.0, y=0.0, xunits=simplekml.Units.fraction,
                                                     yunits=simplekml.Units.fraction)
        screenName.size.x = 0.50
        screenName.size.y = 0.07
        screenName.size.xunits = simplekml.Units.fraction
        screenName.size.yunits = simplekml.Units.fraction

        screen1 = kml.newscreenoverlay(name='Logos')
        screen1.icon.href = "http://" + getDjangoIp() + ":8000/static/img/sharedLogos.png?a="+str(millis)
        screen1.overlayxy = simplekml.OverlayXY(x=0.0, y=0.0, xunits=simplekml.Units.fraction,
                                                yunits=simplekml.Units.fraction)
        screen1.screenxy = simplekml.ScreenXY(x=0.0, y=0.01, xunits=simplekml.Units.fraction,
                                              yunits=simplekml.Units.fraction)
        screen1.rotationxy = simplekml.RotationXY(x=0.0, y=0.0, xunits=simplekml.Units.fraction,
                                                  yunits=simplekml.Units.fraction)
        screen1.size.x = 0.3
        screen1.size.y = 0.25
        screen1.size.xunits = simplekml.Units.fraction
        screen1.size.yunits = simplekml.Units.fraction

        currentDir = os.getcwd()
        fileName = "Layout.kml"
        dir1 = os.path.join(currentDir, "static/logos")
        dirPath2 = os.path.join(dir1, fileName)
        logger.info("\033[93m" + "Saving kml: " + str(dirPath2) + "\033[0m")

        kml.save(dirPath2)

        if db_table_exists("floybd_setting"):
            logger.info("\033[93m" + "Sending Logos...from: " + getDjangoIp() + " to: " + getLGIp() + "\033[0m")

            getLeftScreenCommand = "sshpass -p " + getLGPass() + " ssh lg@" + getLGIp() + \
                                   " 'head -n 1 personavars.txt | cut -c17-19'"
            leftScreenDirty = subprocess.check_output(getLeftScreenCommand, stderr=subprocess.STDOUT, shell=True)
            leftScreenClean = leftScreenDirty.rstrip().decode("utf-8")
            leftScreenNumber = leftScreenClean[-1:]
            logger.debug("Left Screen: " + str(leftScreenClean))
            logger.info("\033[93m" + "Left Screen Number: " + str(leftScreenNumber) + "\033[0m")

            command = "echo 'http://" + getDjangoIp() + ":8000/static/logos/Layout.kml?a="+str(millis) +\
                      "' | sshpass -p " + getLGPass() + " ssh lg@" + getLGIp() + " 'cat - > /var/www/html/kmls_" + \
                      leftScreenNumber+".txt'"

            os.system(command)
예제 #11
0
def sendLogos(lg_IP, lg_Pass, server_IP, proj_name, xPropi, yPropi,
              xAgraiments, yAgraiments):
    millis = int(round(time.time() * 1000))
    kml = simplekml.Kml(name="Layout")
    screen = kml.newscreenoverlay(name="FlOYBD")
    screen.icon.href = "http://" + server_IP + \
        ":5000/logos/propis_" + proj_name + ".png?a=" + str(millis)
    screen.overlayxy = simplekml.OverlayXY(x=0.0,
                                           y=1.0,
                                           xunits=simplekml.Units.fraction,
                                           yunits=simplekml.Units.fraction)
    screen.screenxy = simplekml.ScreenXY(x=0.0,
                                         y=1.0,
                                         xunits=simplekml.Units.fraction,
                                         yunits=simplekml.Units.fraction)
    screen.rotationxy = simplekml.RotationXY(x=0.0,
                                             y=0.0,
                                             xunits=simplekml.Units.fraction,
                                             yunits=simplekml.Units.fraction)
    screen.size.x = xAgraiments
    screen.size.y = yAgraiments
    screen.size.xunits = simplekml.Units.fraction
    screen.size.yunits = simplekml.Units.fraction

    screenName = kml.newscreenoverlay(name='App name')
    screenName.icon.href = "http://" + server_IP + ":5000/logos/" + proj_name + ".png?a=" + \
        str(millis)
    screenName.overlayxy = simplekml.OverlayXY(x=0.0,
                                               y=1.0,
                                               xunits=simplekml.Units.fraction,
                                               yunits=simplekml.Units.fraction)
    screenName.screenxy = simplekml.ScreenXY(x=0.5,
                                             y=0.95,
                                             xunits=simplekml.Units.fraction,
                                             yunits=simplekml.Units.fraction)
    screenName.rotationxy = simplekml.RotationXY(
        x=0.0,
        y=0.0,
        xunits=simplekml.Units.fraction,
        yunits=simplekml.Units.fraction)
    screenName.size.x = xPropi
    screenName.size.y = yPropi
    screenName.size.xunits = simplekml.Units.fraction
    screenName.size.yunits = simplekml.Units.fraction

    screen1 = kml.newscreenoverlay(name='Logos')
    screen1.icon.href = "http://" + server_IP + \
        ":5000/logos/comuns.png?a=" + str(millis)
    screen1.overlayxy = simplekml.OverlayXY(x=0.0,
                                            y=0.0,
                                            xunits=simplekml.Units.fraction,
                                            yunits=simplekml.Units.fraction)
    screen1.screenxy = simplekml.ScreenXY(x=0.0,
                                          y=0.01,
                                          xunits=simplekml.Units.fraction,
                                          yunits=simplekml.Units.fraction)
    screen1.rotationxy = simplekml.RotationXY(x=0.0,
                                              y=0.0,
                                              xunits=simplekml.Units.fraction,
                                              yunits=simplekml.Units.fraction)
    screen1.size.x = 0.3
    screen1.size.y = 0.25
    screen1.size.xunits = simplekml.Units.fraction
    screen1.size.yunits = simplekml.Units.fraction

    currentDir = os.getcwd()
    print "current dir : " + currentDir

    fileName = "Layout.kml"
    dir1 = os.path.join(currentDir, "/logos")
    print dir1
    dirPath2 = os.path.join(dir1, fileName)
    dirPathFinal = currentDir + dirPath2
    kml.save(currentDir + dirPath2)


    getLeftScreenCommand = "sshpass -p " + lg_Pass + " ssh lg@" + lg_IP + \
        " 'head -n 1 personavars.txt | cut -c17-19'"
    leftScreenDirty = subprocess.check_output(getLeftScreenCommand,
                                              stderr=subprocess.STDOUT,
                                              shell=True)
    leftScreenClean = leftScreenDirty.rstrip().decode("utf-8")

    leftScreenNumber = leftScreenClean[-1:]
    #leftScreenNumber = "4"

    print leftScreenNumber
    command = "echo 'http://" + server_IP + ":5000/logos/Layout.kml?a=" + str(millis) +\
        "' | sshpass -p " + lg_Pass + " ssh lg@" + lg_IP + \
        " 'cat - > /var/www/html/kmls_" + leftScreenNumber + ".txt' "
    #command = "echo 'abc' > /tmp/a.txt"
    print command
    subprocess.Popen(command, shell=True)
    print 'y'
예제 #12
0
def make_kmz(job_id, steps, mode, only_vars):
    """
    Create KMZ file from visualization stored in wrfxweb.
    :param job_id: string, the name of job directory
    :param steps: string '1,1,1,3' takes every 3rd frame in domain 4, etc. Default: all 1
    :param mode: string, 'inc', ' to include image files (default), 'ref' to use links only
    :param only_var: list of strings variables to include or None to include  all
    """

    logging.info('make_kmz: job_id=%s' % job_id)
    job_path = osp.join(osp.abspath(sys_cfg.sims_path),job_id)
    url_prefix = pxp.join(sys_cfg.url_root,sys_cfg.sims_url_path,job_id)
    logging.debug('make_kmz: job_path %s' % job_path)
    logging.debug('make_kmz: url_prefix %s' % url_prefix)


    if mode == '' or mode == "inc":
        kmz_filename = job_id + '_inc.kmz'
        href_prefix = osp.abspath(job_path)
        href_join = osp.join
        logging.debug('make_kmz: kmz file will include images from %s' % href_prefix)
        logging.info('make_kmz: kmz file will include images')
    elif mode == "ref":
        kmz_filename = job_id + '_ref.kmz'    
        href_prefix = url_prefix
        href_join = pxp.join
        logging.debug('make_kmz: kmz file will link to images from %s' % href_prefix)
        logging.info('make_kmz: kmz file will link to images')
    else:
        logging.error('make_kmz: arg 2 must be "inc" or "ref" or omitted')
        exit(1)
   
    # read the catalog and the manifest
    cat_path = osp.join(job_path,'catalog.json')
    cat = json.load(open(cat_path))
    if job_id not in cat:
         logging.error('job id %s not in the catalog' % job_id)
         sys.exit(1)
    cat_entry = cat[job_id]
    mf = json.load(open(osp.join(sys_cfg.sims_path,cat_entry['manifest_path'])))

    mdomain = max(map(int, mf.keys()))
    if steps=='':
        step=[1]
    else:
        step=map(int, steps.split(','))
    if len(step) == 1:
        step = step*mdomain
    elif len(step) != mdomain:
        logging.error('make_kmz: steps needed for all up to max domain number = %s' % mdomain)
        sys.exit(1)

    description = cat_entry['description']
    logging.info('make_kmz: job description: %s' % description)
    
    # transpose var and time in manifest, output to frame
    frame={}
    for domain in mf:
        for ts_esmf in mf[domain]:
            for var in mf[domain][ts_esmf]:
                if only_vars is None or var in only_vars:
                    update_nested_dict(frame,{domain:{var:{ts_esmf:mf[domain][ts_esmf][var]}}})
                     
    doc = kml.Kml(name=description)
    
    for domain in sorted(frame):
        domain_folder = doc.newfolder(name = domain)
        istep = step[int(domain)-1]
        logging.info('make_kmz: processing domain %s step %s' % (domain, istep))
        for var in frame[domain]:
            var_folder = domain_folder.newfolder(name = var)
            ts_esmf = sorted(frame[domain][var].keys())
            ts_esmf = ts_esmf[1::istep]
            ts_esmf1 = ts_esmf[1:]
            ts_esmf1.append(None)
            for ts_esmf,ts_esmf1 in zip(ts_esmf,ts_esmf1):
                ts_folder = var_folder.newfolder(name = ts_esmf)
                ts_folder.timespan.begin = ts_esmf.replace('_','T')+'Z'
                if ts_esmf1 is not None:
                     ts_folder.timespan.end = ts_esmf1.replace('_','T')+'Z'
                frame_data = frame[domain][var][ts_esmf]
                raster_path = frame_data['raster']
                coords = frame_data['coords']
                if 'colorbar' in frame_data:
                    # add colorbar to KMZ
                    cb_path = frame_data['colorbar']
                    cbo = ts_folder.newscreenoverlay(name='colorbar')
                    cbo.overlayxy = kml.OverlayXY(x=0,y=1,xunits=kml.Units.fraction,yunits=kml.Units.fraction)
                    cbo.screenxy = kml.ScreenXY(x=0.02,y=0.95,xunits=kml.Units.fraction,yunits=kml.Units.fraction)
                    cbo.size = kml.Size(x=150,y=300,xunits=kml.Units.pixel,yunits=kml.Units.pixel)
                    cbo.color = kml.Color.rgb(255,255,255,a=150)
                    cbo.visibility = 0
                    cbo.icon.href = href_join(href_prefix,cb_path)

                # add ground overlay
                ground = ts_folder.newgroundoverlay(name=var,color='80ffffff')
                ground.gxlatlonquad.coords = coords
                ground.visibility = 0
                ground.icon.href = href_join(href_prefix,raster_path)
    
    # build output file
    kmz_path = osp.join(job_path,kmz_filename)
    logging.info('make_kmz: creating file %s' % kmz_path) 
    doc.savekmz(kmz_path)
    url = pxp.join(url_prefix,kmz_filename)
    logging.info('make_kmz: file created at %s' % url) 
    try:
        r = requests.get(url, stream=True)
        content_size = int(r.headers['Content-Length'])
        logging.info('make_kmz: file size is %s' % content_size) 
        cat[job_id]['kml_url']=url
        cat[job_id]['kml_size']=content_size
        json.dump(cat, open(cat_path,'w'), indent=4, separators=(',', ': '))
    except:
        logging.warning('make_kmz: accessing the file over the web failed') 
예제 #13
0
def make_kml(output_kml, output_format='kmz'):
    
    kml = simplekml.Kml(open=1, name='LandGIS: Open Land Data')
    kml.document.description = link("http://opengeohub.org/about-landgis", 'Read more ...')
    

    
    # Spatial layers
    kml_fld=kml.newfolder(name = 'Spatial layers')
    for i,r in df.iterrows():   # i,r = next(df.iterrows())
        if r.layer_display_type[:2] not in ('2D'):
            continue
        try:
            layer_name = '{}:{}'.format(r.layer_distribution_folder, osp.splitext(r.layer_filename_pattern)[0])
            layer_title = r.layer_title
            time_string = layer_name.split('_')[-2]
    
            layer_desc = '{}</br>{}'.format(link_layer(r), time_string)
            
            # Put TimeStamp or TimeSpan
            td = time_designation(time_string)
            
        except Exception as e:
            print("Error while processing {}: {}".format(layer_name, e))
        else:
            setup_network_link(kml_fld, layer_title, layer_name, description=layer_desc,
                               td=td)
    # 3D Layers
    for i,r in df.loc[df.layer_display_type.apply(lambda x: x[:2]=='3D')].iterrows():   
        # i,r = next(df.loc[df.layer_display_type.apply(lambda x: x[:2]=='3D')].iterrows())
        try:
            layer_group_name = '{}:{}'.format(r.layer_distribution_folder, osp.splitext(r.layer_filename_pattern)[0])
            layers = fnmatch.filter(wms_layers, layer_group_name.replace('*..*','*'))
            if len(layers)==0:
                continue
    
            time_string = layer_group_name.split('_')[-2]
            
            layer_desc = '{}</br>{}'.format(link_layer(r),time_string)        
            kml_fld_lay = kml_fld.newfolder(name = r.layer_title, visibility=0, description=layer_desc, open=0)
            kml_fld_lay.style = folder_style_radio
            
            setup_timeref(kml_fld_lay, time_designation(time_string))        
            
            layer_list = [(x, x.split('_')[-3].split('..')[1]) for x in layers]
            layer_list = sorted(layer_list, key=lambda x: int(x[1].replace('cm','')))
                   
            for layer_name, depth_string in layer_list: # layer_name=layers[0]                                                      
                setup_network_link(kml_fld_lay, depth_string, layer_name)
                
        except Exception as e:
            print("Error while processing {}: {}".format(layer_name, e))
        
            
    
    # Time span layers
    kml_fld = kml.newfolder(name = 'Time span layers')  # new folder 
    for i,r in df.loc[df.layer_display_type.apply(lambda x: x[:2] in ('TS','SS'))].iterrows():   
        # i,r = next(df.loc[df.layer_display_type.apply(lambda x: x[:2]=='TS')].iterrows())
        layer_type = r.layer_display_type[:2]
        try:
            # Find all layers from wms
            layer_group_name = '{}:{}'.format(r.layer_distribution_folder, osp.splitext(r.layer_filename_pattern)[0])
            layers = fnmatch.filter(wms_layers, layer_group_name)        
            if layer_type=='TS':
                layer_list = [(x, x.split('_')[-2]) for x in layers]
                layer_list = sorted(layer_list, key=lambda x: int(x[1].replace('BC','-')))    
            elif layer_type == 'SS':
                layer_list = [(x, find_month(x.split('_')[2])) for x in layers]            
                layer_list = sorted(layer_list, key=lambda x: month_to_number(x[1]))
                
    
            layer_title = r.layer_title
            
            kml_fld_lay = kml_fld.newfolder(name = layer_title, visibility=0, open=0)
            kml_fld_lay.timespan = simplekml.TimeSpan(layer_list[0][1].replace('BC','-'), layer_list[-1][1].replace('BC','-'))
            kml_fld_lay.style = folder_style_radio
            
            if layer_type == 'TS':
                layer_desc = '{}</br>{} .. {}'.format(link_layer(r), layer_list[0][1], layer_list[-1][1])
            elif layer_type == 'SS':
                layer_desc = '{}</br>{}'.format(link_layer(r), layer_group_name.split('_')[-2])                     
            kml_fld_lay.description=layer_desc
            
            for layer_name, time_string in layer_list:                    
                if layer_type == 'TS':
                    td = time_designation(time_string.replace('BC','-'))                
                elif layer_type == 'SS':
                    td = None
    
                setup_network_link(kml_fld_lay, time_string, layer_name, td=td)
                
    
        except Exception as e:
            print("Error while processing {}: {}".format(layer_name, e))    
    
            
    # Logo in ScreenOverlay
    screen = kml.newscreenoverlay(name='OpenGeoHub')
    screen.icon.href = 'https://opengeohub.org/themes/gavias_edubiz/logo.png'
    screen.overlayxy = simplekml.OverlayXY(x=0, y=0, xunits=simplekml.Units.fraction, yunits=simplekml.Units.fraction)
    screen.screenxy = simplekml.ScreenXY(x=0, y=0,  xunits=simplekml.Units.fraction, yunits=simplekml.Units.fraction)
    # screen.description = link('http://opengeohub.org/about-landgis', 'LandGis')
    
    if output_format=='kmz':
        kml.savekmz(output_kml)
    else:
        kml.save(output_kml)
예제 #14
0
    print('[raster2kml] rendering colorbar with unit %s and colormap %s...' %
          (cb_unit, cmap_name))
    cb_png_data = make_colorbar([cbu_min, cbu_max], 'vertical', 2, cmap,
                                vw['name'] + ' ' + cb_unit, varname)
    cb_name = 'colorbar-' + base_name + '.png'
    with open(cb_name, 'w') as f:
        f.write(cb_png_data)
    doc.addfile(cb_name)

    cbo = doc.newscreenoverlay(name='colorbar')
    cbo.overlayxy = kml.OverlayXY(x=0,
                                  y=1,
                                  xunits=kml.Units.fraction,
                                  yunits=kml.Units.fraction)
    cbo.screenxy = kml.ScreenXY(x=0.02,
                                y=0.95,
                                xunits=kml.Units.fraction,
                                yunits=kml.Units.fraction)
    cbo.size = kml.Size(x=150,
                        y=300,
                        xunits=kml.Units.pixel,
                        yunits=kml.Units.pixel)
    cbo.color = kml.Color.rgb(255, 255, 255, a=150)
    cbo.visibility = 1
    cbo.icon.href = cb_name

    print(
        '[raster2kml] rendering raster from variable %s (Mercator projection) ...'
        % varname)
    ground = doc.newgroundoverlay(name=varname, color='80ffffff')
    raster_png_data, corner_coords = basemap_raster_mercator(
        lon, lat, fa, fa_min, fa_max, cmap)
예제 #15
0
bb_y = np.empty(0, dtype=float)

#Add Logo as screenoverlay
logo_url = 'https://s3.amazonaws.com/kml-test.carteasyn.com/logo/carteasyn-gsb.png'
screen = folder.newscreenoverlay(name='ScreenOverlay')
m_screen = m_folder.newscreenoverlay(name='ScreenOverlay')
screen.icon.href = logo_url
m_screen.icon.href = logo_url

#sets location, overlayxy is position on image, screenxy corresponding screen position
screen.overlayxy = simplekml.OverlayXY(x=0.5,
                                       y=0,
                                       xunits=simplekml.Units.fraction,
                                       yunits=simplekml.Units.fraction)
screen.screenxy = simplekml.ScreenXY(x=0.91,
                                     y=0.12,
                                     xunits=simplekml.Units.fraction,
                                     yunits=simplekml.Units.fraction)

m_screen.overlayxy = simplekml.OverlayXY(x=0.5,
                                         y=0,
                                         xunits=simplekml.Units.fraction,
                                         yunits=simplekml.Units.fraction)
m_screen.screenxy = simplekml.ScreenXY(x=0.91,
                                       y=0.12,
                                       xunits=simplekml.Units.fraction,
                                       yunits=simplekml.Units.fraction)
#Image size & units
screen.size.x = 180
screen.size.y = 120
screen.size.xunits = simplekml.Units.pixel
screen.size.yunits = simplekml.Units.pixel