1 package tim.prune.gui.map;
3 import tim.prune.I18nManager;
6 * Class to provide a map source for all OSM-like sources
7 * (eg mapnik, opencyclemap, openpistemap etc).
8 * These can be single-layer or double-layer sources with tiles
9 * in various formats (default png)
11 public class OsmMapSource extends MapSource
13 /** Name for this source */
14 private String _name = null;
16 private String[] _baseUrls = null;
18 private String[] _siteNames = null;
19 /** Maximum zoom level */
20 private int _maxZoom = 0;
23 * Constructor giving single name and url
24 * @param inName source name
25 * @param inUrl base url
27 public OsmMapSource(String inName, String inUrl)
29 this(inName, inUrl, "png", null, null, 18);
33 * Constructor giving name, two strings and maximum zoom
34 * @param inName source name
35 * @param inStr1 base layer url
36 * @param inStr2 either base layer extension or upper layer url
37 * @param inMaxZoom maximum zoom level
39 public OsmMapSource(String inName, String inStr1, String inStr2, int inMaxZoom)
41 if (inStr2 != null && inStr2.length() == 3)
42 init(inName, inStr1, inStr2, null, null, 18);
44 init(inName, inStr1, "png", inStr2, "png", 18);
48 * Constructor giving name, urls, extensions and maximum zoom
49 * @param inName source name
50 * @param inUrl1 base layer url
51 * @param inExt1 extension for base layer
52 * @param inUrl2 upper layer url
53 * @param inExt2 extension for top layer
54 * @param inMaxZoom maximum zoom level
56 public OsmMapSource(String inName, String inUrl1, String inExt1,
57 String inUrl2, String inExt2, int inMaxZoom)
59 init(inName, inUrl1, inExt1, inUrl2, inExt2, inMaxZoom);
63 * Initialisation giving name, urls, extensions and maximum zoom
64 * @param inName source name
65 * @param inUrl1 base layer url
66 * @param inExt1 extension for base layer
67 * @param inUrl2 upper layer url
68 * @param inExt2 extension for top layer
69 * @param inMaxZoom maximum zoom level
71 private void init(String inName, String inUrl1, String inExt1,
72 String inUrl2, String inExt2, int inMaxZoom)
75 if (_name == null || _name.trim().equals("")) {_name = I18nManager.getText("mapsource.unknown");}
76 _baseUrls = new String[2];
77 _baseUrls[0] = fixBaseUrl(inUrl1);
78 _baseUrls[1] = fixBaseUrl(inUrl2);
79 _extensions = new String[2];
80 _extensions[0] = inExt1;
81 _extensions[1] = inExt2;
82 _siteNames = new String[2];
83 _siteNames[0] = fixSiteName(_baseUrls[0]);
84 _siteNames[1] = fixSiteName(_baseUrls[1]);
85 // Swap layers if second layer given without first
86 if (_baseUrls[0] == null && _baseUrls[1] != null)
88 _baseUrls[0] = _baseUrls[1];
89 _siteNames[0] = _siteNames[1];
90 _baseUrls[1] = _siteNames[1] = null;
96 * Construct a new map source from its config string
97 * @param inConfigString string from Config, separated by semicolons
98 * @return new map source, or null if not parseable
100 public static OsmMapSource fromConfig(String inConfigString)
102 OsmMapSource source = null;
103 if (inConfigString.startsWith("o:"))
105 String[] items = inConfigString.substring(2).split(";");
107 if (items.length == 3) { // single source url
108 source = new OsmMapSource(items[0], items[1], null, Integer.parseInt(items[2]));
110 else if (items.length == 4) { // two urls or one url plus extension
111 source = new OsmMapSource(items[0], items[1], items[2], Integer.parseInt(items[3]));
113 else if (items.length == 6) { // two urls and two extensions
114 source = new OsmMapSource(items[0], items[1], items[2], items[3], items[4], Integer.parseInt(items[5]));
116 } catch (NumberFormatException nfe) {}
124 public String getName() {
128 /** Number of layers */
129 public int getNumLayers() {
130 return _baseUrls[1] == null?1:2;
133 /** Base url for this source */
134 public String getBaseUrl(int inLayerNum) {
135 return _baseUrls[inLayerNum];
138 /** site name without protocol or www. */
139 public String getSiteName(int inLayerNum) {
140 return _siteNames[inLayerNum];
144 * Make the URL to get the specified tile
146 public String makeURL(int inLayerNum, int inZoom, int inX, int inY)
148 return _baseUrls[inLayerNum] + inZoom + "/" + inX + "/" + inY + "." + getFileExtension(inLayerNum);
152 * @return maximum zoom level
154 public final int getMaxZoomLevel()
161 * @return semicolon-separated list of all fields
163 public String getConfigString()
165 return "o:" + getName() + ";" + getSiteStrings() + getMaxZoomLevel();