Nasa World Wind

Hello,

i’m trying to get my Mapnik TMS Service working with the Nasa World Wind Java SDK (http://worldwind.arc.nasa.gov/java/). Has anybody experience with it?

My current example is really simple. I have got an App, which creates the basic WWJ Features needed:

package main;


import gov.nasa.worldwind.BasicModel;
import gov.nasa.worldwind.awt.WorldWindowGLCanvas;
import gov.nasa.worldwind.globes.Earth;
import gov.nasa.worldwind.layers.LayerList;
import javax.swing.JFrame;
import layers.OSMMapnikLayer;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
/**
 *
 * @author 
 */
public class TMSViewer extends JFrame {

    public TMSViewer() {
        WorldWindowGLCanvas wwd = new WorldWindowGLCanvas();
        wwd.setPreferredSize(new java.awt.Dimension(1000, 800));
        this.getContentPane().add(wwd, java.awt.BorderLayout.CENTER);
        LayerList layers = new LayerList();
        layers.add(new OSMMapnikLayer("my_tms_server"));
        wwd.setModel(new BasicModel(new Earth(),layers));
    }
    
        public static void main(String[] args)
    {
        java.awt.EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                JFrame frame = new TMSViewer();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.pack();                
                frame.setVisible(true);
            }
        });
    }
}

The Layer i’m using is one of the integrated example layers, which query http://a.tile.openstreetmap.org/:
http://worldwind31.arc.nasa.gov/svn/trunk/WorldWind/src/gov/nasa/worldwind/layers/Earth/OSMMapnikLayer.java

My goal is to query my own server, which has a 4326 tiling-scheme and a 900913 tiling-scheme.

900913 has 4 tiles on zoom level zero, so i adjusted the OSMMapnikLayer class and it works:

/*
Copyright (C) 2001, 2009 United States Government
as represented by the Administrator of the
National Aeronautics and Space Administration.
All Rights Reserved.
*/
package layers;

import gov.nasa.worldwind.avlist.*;
import gov.nasa.worldwind.geom.*;
import gov.nasa.worldwind.layers.mercator.*;
import gov.nasa.worldwind.util.*;

import java.net.*;

public class OSMMapnikLayer extends BasicMercatorTiledImageLayer
{
    public OSMMapnikLayer(String service)
    {
        super(makeLevels(service));
    }

    private static LevelSet makeLevels(String service)
    {
        AVList params = new AVListImpl();

        params.setValue(AVKey.TILE_WIDTH, 256);
        params.setValue(AVKey.TILE_HEIGHT, 256);
        params.setValue(AVKey.DATA_CACHE_NAME, "Earth/OSM-Mercator/OpenStreetMap Mapnik");
        params.setValue(AVKey.SERVICE, service);
        params.setValue(AVKey.DATASET_NAME, "h");
        params.setValue(AVKey.FORMAT_SUFFIX, ".png");
        params.setValue(AVKey.NUM_LEVELS, 16);
        params.setValue(AVKey.NUM_EMPTY_LEVELS, 0);
        params.setValue(AVKey.LEVEL_ZERO_TILE_DELTA, new LatLon(Angle
            .fromDegrees(90.0d), Angle.fromDegrees(180d)));
        params.setValue(AVKey.SECTOR, new MercatorSector(-1.0, 1.0, Angle.NEG180, Angle.POS180));
        params.setValue(AVKey.TILE_URL_BUILDER, new URLBuilder());

        return new LevelSet(params);
    }

    private static class URLBuilder implements TileUrlBuilder
    {
        public URL getURL(Tile tile, String imageFormat)
            throws MalformedURLException
        {
            System.out.println("Tile: " + tile + "=> Level: " + tile.getLevelNumber() + " Column: " + tile.getColumn() + " Row: " + tile.getRow() + " URI /" + tile.getLevelNumber() + "/" + tile.getColumn() + "/"
                + tile.getRow() + ".png");
            return new URL(tile.getLevel().getService() + "/" + tile.getLevelNumber() + "/" + tile.getColumn() + "/"
                + tile.getRow() + ".png");
        }
    }

    @Override
    public String toString()
    {
        return "OpenStreetMap";
    }
}

4326 would need the following changes with my understanding, but it doesn’t work:

        params.setValue(AVKey.LEVEL_ZERO_TILE_DELTA, new LatLon(Angle
            .fromDegrees(180.0d), Angle.fromDegrees(180d)));

Maybe someone can spot the problem.

Thanks in regards!