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;
21 /** API key, usually remains empty */
22 private String _apiKey = null;
26 * Constructor giving single name and url
27 * @param inName source name
28 * @param inUrl base url
30 public OsmMapSource(String inName, String inUrl)
32 this(inName, inUrl, "png", null, null, 18);
36 * Constructor giving name, two strings and maximum zoom
37 * @param inName source name
38 * @param inStr1 base layer url
39 * @param inStr2 either base layer extension or upper layer url
40 * @param inMaxZoom maximum zoom level
42 public OsmMapSource(String inName, String inStr1, String inStr2, int inMaxZoom)
44 if (inStr2 != null && inStr2.length() == 3)
45 init(inName, inStr1, inStr2, null, null, inMaxZoom);
47 init(inName, inStr1, "png", inStr2, "png", inMaxZoom);
51 * Constructor giving name, urls, extensions and maximum zoom
52 * @param inName source name
53 * @param inUrl1 base layer url
54 * @param inExt1 extension for base layer
55 * @param inUrl2 upper layer url
56 * @param inExt2 extension for top layer
57 * @param inMaxZoom maximum zoom level
59 public OsmMapSource(String inName, String inUrl1, String inExt1,
60 String inUrl2, String inExt2, int inMaxZoom)
62 init(inName, inUrl1, inExt1, inUrl2, inExt2, inMaxZoom);
66 * Initialisation giving name, urls, extensions and maximum zoom
67 * @param inName source name
68 * @param inUrl1 base layer url
69 * @param inExt1 extension for base layer
70 * @param inUrl2 upper layer url
71 * @param inExt2 extension for top layer
72 * @param inMaxZoom maximum zoom level
74 private void init(String inName, String inUrl1, String inExt1,
75 String inUrl2, String inExt2, int inMaxZoom)
78 if (_name == null || _name.trim().equals("")) {_name = I18nManager.getText("mapsource.unknown");}
79 _baseUrls = new String[2];
80 _baseUrls[0] = fixBaseUrl(inUrl1);
81 _baseUrls[1] = fixBaseUrl(inUrl2);
82 _extensions = new String[2];
83 _extensions[0] = inExt1;
84 _extensions[1] = inExt2;
85 _siteNames = new String[2];
86 _siteNames[0] = SiteNameUtils.convertUrlToDirectory(_baseUrls[0]);
87 _siteNames[1] = SiteNameUtils.convertUrlToDirectory(_baseUrls[1]);
88 // Swap layers if second layer given without first
89 if (_baseUrls[0] == null && _baseUrls[1] != null)
91 _baseUrls[0] = _baseUrls[1];
92 _siteNames[0] = _siteNames[1];
93 _baseUrls[1] = _siteNames[1] = null;
98 /** Set the API key (if required) */
99 public void setApiKey(String inKey)
105 * Construct a new map source from its config string
106 * @param inConfigString string from Config, separated by semicolons
107 * @return new map source, or null if not parseable
109 public static OsmMapSource fromConfig(String inConfigString)
111 OsmMapSource source = null;
112 if (inConfigString.startsWith("o:"))
114 String[] items = inConfigString.substring(2).split(";");
116 if (items.length == 3) { // single source url
117 source = new OsmMapSource(items[0], items[1], null, Integer.parseInt(items[2]));
119 else if (items.length == 4) { // two urls or one url plus extension
120 source = new OsmMapSource(items[0], items[1], items[2], Integer.parseInt(items[3]));
122 else if (items.length == 6) { // two urls and two extensions
123 source = new OsmMapSource(items[0], items[1], items[2], items[3], items[4], Integer.parseInt(items[5]));
125 } catch (NumberFormatException nfe) {}
133 public String getName() {
137 /** Number of layers */
138 public int getNumLayers() {
139 return _baseUrls[1] == null?1:2;
142 /** Base url for this source */
143 public String getBaseUrl(int inLayerNum) {
144 return _baseUrls[inLayerNum];
147 /** site name without protocol or www. */
148 public String getSiteName(int inLayerNum) {
149 return _siteNames[inLayerNum];
153 * Make the URL to get the specified tile
155 public String makeURL(int inLayerNum, int inZoom, int inX, int inY)
157 // Check if the base url has a [1234], if so replace at random
158 StringBuffer url = new StringBuffer();
159 url.append(SiteNameUtils.pickServerUrl(_baseUrls[inLayerNum]));
160 url.append(inZoom).append('/').append(inX).append('/').append(inY);
161 url.append('.').append(getFileExtension(inLayerNum));
164 url.append("?apikey=").append(_apiKey);
166 return url.toString();
170 * @return maximum zoom level
172 public final int getMaxZoomLevel()
178 * @return semicolon-separated list of all fields
180 public String getConfigString()
182 return "o:" + getName() + ";" + getSiteStrings() + getMaxZoomLevel();