Skip to content

Commit a840f19

Browse files
authored
Merge pull request #41 from Sufaev/feature/refactor-mercator-layer
Feature/refactor mercator layer
2 parents 563f37f + 64845f1 commit a840f19

File tree

10 files changed

+311
-1683
lines changed

10 files changed

+311
-1683
lines changed

src/config/worldwind.layers.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,10 @@
3030
<Layer href="config/Earth/USGSTopoLowResLayer.xml" actuate="onRequest"/>
3131
<Layer href="config/Earth/USGSTopoMedResLayer.xml" actuate="onRequest"/>
3232
<Layer href="config/Earth/USGSTopoHighResLayer.xml" actuate="onRequest"/>
33+
<!--<Layer className="gov.nasa.worldwind.layers.Earth.OpenTopoMapLayer" actuate="onRequest"/>-->
3334
<!--<Layer className="gov.nasa.worldwind.layers.Earth.OSMMapnikLayer" actuate="onRequest"/>-->
3435
<!--<Layer className="gov.nasa.worldwind.layers.Earth.OSMCycleMapLayer" actuate="onRequest"/>-->
36+
<!--<Layer className="gov.nasa.worldwind.layers.Earth.WikimapiaLayer" actuate="onRequest"/>-->
3537
<Layer className="gov.nasa.worldwind.layers.Earth.CountryBoundariesLayer" actuate="onRequest"/>
3638
<Layer href="config/Earth/OpenStreetMap.xml" actuate="onRequest"/>
3739
<!--<Layer href="config/Earth/WorldBordersShapefile.xml" actuate="onRequest"/>-->

src/gov/nasa/worldwind/layers/Earth/OSMCycleMapLayer.java

Lines changed: 32 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,7 @@
55
*/
66
package gov.nasa.worldwind.layers.Earth;
77

8-
import gov.nasa.worldwind.avlist.*;
9-
import gov.nasa.worldwind.geom.*;
108
import gov.nasa.worldwind.layers.mercator.*;
11-
import gov.nasa.worldwind.util.*;
129

1310
import java.net.*;
1411

@@ -17,45 +14,38 @@
1714
*/
1815
public class OSMCycleMapLayer extends BasicMercatorTiledImageLayer
1916
{
20-
public OSMCycleMapLayer()
21-
{
22-
super(makeLevels());
17+
public OSMCycleMapLayer()
18+
{
19+
super("h", "Earth/OSM-Mercator/OpenStreetMap Cycle", 19, 256, false, ".png", new URLBuilder());
20+
}
21+
22+
private static class URLBuilder extends MercatorTileUrlBuilder
23+
{
24+
private String apiKey;
25+
26+
@Override
27+
protected URL getMercatorURL(int x, int y, int z) throws MalformedURLException
28+
{
29+
String urlPostfix = (this.apiKey != null) ? "?apikey=" + this.apiKey : "";
30+
return new URL("https://a.tile.thunderforest.com/cycle/" + z + "/" + x + "/" + y + ".png" + urlPostfix);
31+
}
32+
}
33+
34+
public void setAPIKey(String apiKey)
35+
{
36+
URLBuilder urlBuilder = (URLBuilder)getURLBuilder();
37+
urlBuilder.apiKey = apiKey;
38+
}
39+
40+
public String getAPIKey()
41+
{
42+
URLBuilder urlBuilder = (URLBuilder)getURLBuilder();
43+
return urlBuilder.apiKey;
2344
}
2445

25-
private static LevelSet makeLevels()
26-
{
27-
AVList params = new AVListImpl();
28-
29-
params.setValue(AVKey.TILE_WIDTH, 256);
30-
params.setValue(AVKey.TILE_HEIGHT, 256);
31-
params.setValue(AVKey.DATA_CACHE_NAME, "Earth/OSM-Mercator/OpenStreetMap Cycle");
32-
params.setValue(AVKey.SERVICE, "http://b.andy.sandbox.cloudmade.com/tiles/cycle/");
33-
params.setValue(AVKey.DATASET_NAME, "*");
34-
params.setValue(AVKey.FORMAT_SUFFIX, ".png");
35-
params.setValue(AVKey.NUM_LEVELS, 16);
36-
params.setValue(AVKey.NUM_EMPTY_LEVELS, 0);
37-
params.setValue(AVKey.LEVEL_ZERO_TILE_DELTA, new LatLon(Angle
38-
.fromDegrees(22.5d), Angle.fromDegrees(45d)));
39-
params.setValue(AVKey.SECTOR, new MercatorSector(-1.0, 1.0,
40-
Angle.NEG180, Angle.POS180));
41-
params.setValue(AVKey.TILE_URL_BUILDER, new URLBuilder());
42-
43-
return new LevelSet(params);
44-
}
45-
46-
private static class URLBuilder implements TileUrlBuilder
47-
{
48-
public URL getURL(Tile tile, String imageFormat)
49-
throws MalformedURLException
50-
{
51-
return new URL(tile.getLevel().getService()
52-
+ (tile.getLevelNumber() + 3) +"/"+ tile.getColumn()+"/"+ ((1 << (tile.getLevelNumber()) + 3) - 1 - tile.getRow()) + ".png");
53-
}
54-
}
55-
56-
@Override
57-
public String toString()
58-
{
59-
return "OpenStreetMap Cycle";
60-
}
46+
@Override
47+
public String toString()
48+
{
49+
return "OpenStreetMap Cycle";
50+
}
6151
}

src/gov/nasa/worldwind/layers/Earth/OSMMapnikLayer.java

Lines changed: 5 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,7 @@
55
*/
66
package gov.nasa.worldwind.layers.Earth;
77

8-
import gov.nasa.worldwind.avlist.*;
9-
import gov.nasa.worldwind.geom.*;
108
import gov.nasa.worldwind.layers.mercator.*;
11-
import gov.nasa.worldwind.util.*;
129

1310
import java.net.*;
1411

@@ -19,37 +16,15 @@ public class OSMMapnikLayer extends BasicMercatorTiledImageLayer
1916
{
2017
public OSMMapnikLayer()
2118
{
22-
super(makeLevels());
19+
super("h", "Earth/OSM-Mercator/OpenStreetMap Mapnik", 19, 256, false, ".png", new URLBuilder());
2320
}
2421

25-
private static LevelSet makeLevels()
22+
private static class URLBuilder extends MercatorTileUrlBuilder
2623
{
27-
AVList params = new AVListImpl();
28-
29-
params.setValue(AVKey.TILE_WIDTH, 256);
30-
params.setValue(AVKey.TILE_HEIGHT, 256);
31-
params.setValue(AVKey.DATA_CACHE_NAME, "Earth/OSM-Mercator/OpenStreetMap Mapnik");
32-
params.setValue(AVKey.SERVICE, "http://a.tile.openstreetmap.org/");
33-
params.setValue(AVKey.DATASET_NAME, "h");
34-
params.setValue(AVKey.FORMAT_SUFFIX, ".png");
35-
params.setValue(AVKey.NUM_LEVELS, 16);
36-
params.setValue(AVKey.NUM_EMPTY_LEVELS, 0);
37-
params.setValue(AVKey.LEVEL_ZERO_TILE_DELTA, new LatLon(Angle
38-
.fromDegrees(22.5d), Angle.fromDegrees(45d)));
39-
params.setValue(AVKey.SECTOR, new MercatorSector(-1.0, 1.0, Angle.NEG180, Angle.POS180));
40-
params.setValue(AVKey.TILE_URL_BUILDER, new URLBuilder());
41-
42-
return new LevelSet(params);
43-
}
44-
45-
private static class URLBuilder implements TileUrlBuilder
46-
{
47-
public URL getURL(Tile tile, String imageFormat)
48-
throws MalformedURLException
24+
@Override
25+
protected URL getMercatorURL(int x, int y, int z) throws MalformedURLException
4926
{
50-
return new URL(tile.getLevel().getService()
51-
+ (tile.getLevelNumber() + 3) + "/" + tile.getColumn() + "/"
52-
+ ((1 << (tile.getLevelNumber()) + 3) - 1 - tile.getRow()) + ".png");
27+
return new URL("https://a.tile.openstreetmap.org/" + z + "/" + x + "/" + y + ".png");
5328
}
5429
}
5530

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/*
2+
* Copyright (C) 2012 United States Government as represented by the Administrator of the
3+
* National Aeronautics and Space Administration.
4+
* All Rights Reserved.
5+
*/
6+
package gov.nasa.worldwind.layers.Earth;
7+
8+
import gov.nasa.worldwind.layers.mercator.*;
9+
10+
import java.net.*;
11+
12+
/**
13+
* @author Sufaev
14+
*/
15+
public class OpenTopoMapLayer extends BasicMercatorTiledImageLayer
16+
{
17+
public OpenTopoMapLayer()
18+
{
19+
super("otm", "Earth/OpenTopoMap", 17, 256, false, ".png", new URLBuilder());
20+
}
21+
22+
private static class URLBuilder extends MercatorTileUrlBuilder
23+
{
24+
@Override
25+
protected URL getMercatorURL(int x, int y, int z) throws MalformedURLException
26+
{
27+
return new URL("https://a.tile.opentopomap.org/" + z + "/" + x + "/" + y + ".png");
28+
}
29+
}
30+
31+
@Override
32+
public String toString()
33+
{
34+
return "OpenTopoMap";
35+
}
36+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
/*
2+
* Copyright (C) 2012 United States Government as represented by the Administrator of the
3+
* National Aeronautics and Space Administration.
4+
* All Rights Reserved.
5+
*/
6+
package gov.nasa.worldwind.layers.Earth;
7+
8+
import gov.nasa.worldwind.layers.mercator.*;
9+
10+
import java.net.*;
11+
12+
/**
13+
* @author Sufaev
14+
*/
15+
public class WikimapiaLayer extends BasicMercatorTiledImageLayer
16+
{
17+
public enum Type {MAP, HYBRID}
18+
19+
public WikimapiaLayer()
20+
{
21+
super("wm", "Earth/Wikimapia", 19, 256, true, ".png", new URLBuilder());
22+
}
23+
24+
private static class URLBuilder extends MercatorTileUrlBuilder
25+
{
26+
private Type type;
27+
28+
private URLBuilder()
29+
{
30+
this.type = Type.HYBRID;
31+
}
32+
33+
@Override
34+
protected URL getMercatorURL(int x, int y, int z) throws MalformedURLException
35+
{
36+
int i = x % 4 + (y % 4) * 4;
37+
return new URL("http://i" + i + ".wikimapia.org/?lng=0&x=" + x + "&y=" + y + "&zoom=" + z + "&type=" + this.type.name().toLowerCase());
38+
}
39+
}
40+
41+
public void setType(String type)
42+
{
43+
URLBuilder urlBuilder = (URLBuilder)getURLBuilder();
44+
urlBuilder.type = Type.valueOf(type);
45+
46+
// Toggle overlay based on whether it is a hybrid map or not.
47+
boolean isHybrid = urlBuilder.type.equals(Type.HYBRID);
48+
setUseTransparentTextures(isHybrid);
49+
}
50+
51+
public String getType()
52+
{
53+
URLBuilder urlBuilder = (URLBuilder)getURLBuilder();
54+
return urlBuilder.type.name();
55+
}
56+
57+
@Override
58+
public String toString()
59+
{
60+
return "Wikimapia";
61+
}
62+
}

0 commit comments

Comments
 (0)