]> gitweb.fperrin.net Git - GpsPrune.git/blob - tim/prune/gui/map/OsmMapSource.java
09def4597eb72977357930b9ea492c1c9d198a45
[GpsPrune.git] / 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
22         /**
23          * Constructor giving single name and url
24          * @param inName source name
25          * @param inUrl base url
26          */
27         public OsmMapSource(String inName, String inUrl)
28         {
29                 this(inName, inUrl, "png", null, null, 18);
30         }
31
32         /**
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
38          */
39         public OsmMapSource(String inName, String inStr1, String inStr2, int inMaxZoom)
40         {
41                 if (inStr2 != null && inStr2.length() == 3)
42                         init(inName, inStr1, inStr2, null, null, 18);
43                 else
44                         init(inName, inStr1, "png", inStr2, "png", 18);
45         }
46
47         /**
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
55          */
56         public OsmMapSource(String inName, String inUrl1, String inExt1,
57                 String inUrl2, String inExt2, int inMaxZoom)
58         {
59                 init(inName, inUrl1, inExt1, inUrl2, inExt2, inMaxZoom);
60         }
61
62         /**
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
70          */
71         private void init(String inName, String inUrl1, String inExt1,
72                 String inUrl2, String inExt2, int inMaxZoom)
73         {
74                 _name = inName;
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)
87                 {
88                         _baseUrls[0] = _baseUrls[1];
89                         _siteNames[0] = _siteNames[1];
90                         _baseUrls[1] = _siteNames[1] = null;
91                 }
92                 _maxZoom = inMaxZoom;
93         }
94
95         /**
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
99          */
100         public static OsmMapSource fromConfig(String inConfigString)
101         {
102                 OsmMapSource source = null;
103                 if (inConfigString.startsWith("o:"))
104                 {
105                         String[] items = inConfigString.substring(2).split(";");
106                         try {
107                                 if (items.length == 3) { // single source url
108                                         source = new OsmMapSource(items[0], items[1], null, Integer.parseInt(items[2]));
109                                 }
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]));
112                                 }
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]));
115                                 }
116                         } catch (NumberFormatException nfe) {}
117                 }
118                 return source;
119         }
120
121         /**
122          * @return name
123          */
124         public String getName() {
125                 return _name;
126         }
127
128         /** Number of layers */
129         public int getNumLayers() {
130                 return _baseUrls[1] == null?1:2;
131         }
132
133         /** Base url for this source */
134         public String getBaseUrl(int inLayerNum) {
135                 return _baseUrls[inLayerNum];
136         }
137
138         /** site name without protocol or www. */
139         public String getSiteName(int inLayerNum) {
140                 return _siteNames[inLayerNum];
141         }
142
143         /**
144          * Make the URL to get the specified tile
145          */
146         public String makeURL(int inLayerNum, int inZoom, int inX, int inY)
147         {
148                 return _baseUrls[inLayerNum] + inZoom + "/" + inX + "/" + inY + "." + getFileExtension(inLayerNum);
149         }
150
151         /**
152          * @return maximum zoom level
153          */
154         public final int getMaxZoomLevel()
155         {
156                 return _maxZoom;
157         }
158
159
160         /**
161          * @return semicolon-separated list of all fields
162          */
163         public String getConfigString()
164         {
165                 return "o:" +  getName() + ";" + getSiteStrings() + getMaxZoomLevel();
166         }
167 }