]> gitweb.fperrin.net Git - GpsPrune.git/blob - src/tim/prune/gui/map/OsmMapSource.java
Version 20.4, May 2021
[GpsPrune.git] / src / tim / prune / gui / map / OsmMapSource.java
1 package tim.prune.gui.map;
2
3 import tim.prune.I18nManager;
4
5 /**
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)
10  */
11 public class OsmMapSource extends MapSource
12 {
13         /** Name for this source */
14         private String _name = null;
15         /** Base urls */
16         private String[] _baseUrls = null;
17         /** Site names */
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;
23
24
25         /**
26          * Constructor giving single name and url
27          * @param inName source name
28          * @param inUrl base url
29          */
30         public OsmMapSource(String inName, String inUrl)
31         {
32                 this(inName, inUrl, "png", null, null, 18);
33         }
34
35         /**
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
41          */
42         public OsmMapSource(String inName, String inStr1, String inStr2, int inMaxZoom)
43         {
44                 if (inStr2 != null && inStr2.length() == 3)
45                         init(inName, inStr1, inStr2, null, null, inMaxZoom);
46                 else
47                         init(inName, inStr1, "png", inStr2, "png", inMaxZoom);
48         }
49
50         /**
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
58          */
59         public OsmMapSource(String inName, String inUrl1, String inExt1,
60                 String inUrl2, String inExt2, int inMaxZoom)
61         {
62                 init(inName, inUrl1, inExt1, inUrl2, inExt2, inMaxZoom);
63         }
64
65         /**
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
73          */
74         private void init(String inName, String inUrl1, String inExt1,
75                 String inUrl2, String inExt2, int inMaxZoom)
76         {
77                 _name = inName;
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)
90                 {
91                         _baseUrls[0] = _baseUrls[1];
92                         _siteNames[0] = _siteNames[1];
93                         _baseUrls[1] = _siteNames[1] = null;
94                 }
95                 _maxZoom = inMaxZoom;
96         }
97
98         /** Set the API key (if required) */
99         public void setApiKey(String inKey)
100         {
101                 _apiKey = inKey;
102         }
103
104         /**
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
108          */
109         public static OsmMapSource fromConfig(String inConfigString)
110         {
111                 OsmMapSource source = null;
112                 if (inConfigString.startsWith("o:"))
113                 {
114                         String[] items = inConfigString.substring(2).split(";");
115                         try {
116                                 if (items.length == 3) { // single source url
117                                         source = new OsmMapSource(items[0], items[1], null, Integer.parseInt(items[2]));
118                                 }
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]));
121                                 }
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]));
124                                 }
125                         } catch (NumberFormatException nfe) {}
126                 }
127                 return source;
128         }
129
130         /**
131          * @return name
132          */
133         public String getName() {
134                 return _name;
135         }
136
137         /** Number of layers */
138         public int getNumLayers() {
139                 return _baseUrls[1] == null?1:2;
140         }
141
142         /** Base url for this source */
143         public String getBaseUrl(int inLayerNum) {
144                 return _baseUrls[inLayerNum];
145         }
146
147         /** site name without protocol or www. */
148         public String getSiteName(int inLayerNum) {
149                 return _siteNames[inLayerNum];
150         }
151
152         /**
153          * Make the URL to get the specified tile
154          */
155         public String makeURL(int inLayerNum, int inZoom, int inX, int inY)
156         {
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));
162                 if (_apiKey != null)
163                 {
164                         url.append("?apikey=").append(_apiKey);
165                 }
166                 return url.toString();
167         }
168
169         /**
170          * @return maximum zoom level
171          */
172         public final int getMaxZoomLevel()
173         {
174                 return _maxZoom;
175         }
176
177         /**
178          * @return semicolon-separated list of all fields
179          */
180         public String getConfigString()
181         {
182                 return "o:" +  getName() + ";" + getSiteStrings() + getMaxZoomLevel();
183         }
184 }