Skip to content

Commit 24d8557

Browse files
committed
Implement tile sources
1 parent bebde28 commit 24d8557

File tree

8 files changed

+264
-56
lines changed

8 files changed

+264
-56
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ OpenTopoMap viewer for Android
66

77
- Follow location
88
- Import GPX
9+
- Lonvia hiking routes
10+
- Lonvia cycling routes
911

1012
![Wageningen](screen_wag.png "Wageningen") ![WUR](screen_wur.png "WUR")
1113

app/src/main/java/org/nitri/opentopo/MapFragment.java

Lines changed: 144 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import android.annotation.SuppressLint;
44
import android.content.Context;
55
import android.content.DialogInterface;
6+
import android.content.SharedPreferences;
67
import android.graphics.Bitmap;
78
import android.graphics.BitmapFactory;
89
import android.location.Location;
@@ -98,7 +99,21 @@ public boolean onZoom(ZoomEvent event) {
9899
final static String PARAM_LATITUDE = "latitude";
99100
final static String PARAM_LONGITUDE = "longitude";
100101

102+
private SharedPreferences mPrefs;
103+
private static final String MAP_PREFS = "map_prefs";
104+
105+
final static String PREF_BASE_MAP = "base_map";
106+
final static String PREF_OVERLAY = "overlay";
107+
108+
final static int BASE_MAP_OTM = 1;
109+
final static int BASE_MAP_OSM = 2;
110+
111+
112+
private int mBaseMap = BASE_MAP_OTM;
113+
101114
private static final String TAG = MapFragment.class.getSimpleName();
115+
private TextView mCopyRightView;
116+
private int mOverlay = OverlayHelper.OVERLAY_NONE;
102117

103118
public MapFragment() {
104119
// Required empty public constructor
@@ -123,6 +138,11 @@ public void onCreate(Bundle savedInstanceState) {
123138
setHasOptionsMenu(true);
124139
setRetainInstance(true);
125140
Configuration.getInstance().setUserAgentValue(BuildConfig.APPLICATION_ID);
141+
if (getActivity() != null) {
142+
mPrefs = getActivity().getSharedPreferences(MAP_PREFS, Context.MODE_PRIVATE);
143+
mBaseMap = mPrefs.getInt(PREF_BASE_MAP, BASE_MAP_OTM);
144+
mOverlay = mPrefs.getInt(PREF_OVERLAY, OverlayHelper.OVERLAY_NONE);
145+
}
126146
}
127147

128148
@Override
@@ -164,30 +184,20 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
164184
mMapView.getOverlays().add(this.mCompassOverlay);
165185
mMapView.getOverlays().add(this.mScaleBarOverlay);
166186

167-
mMapView.setTileSource(TileSourceFactory.OpenTopo);
168-
169-
//final OnlineTileSourceBase localTopo = new XYTileSource("OpenTopoMap", 0, 19, 256, ".png",
170-
// new String[]{"http://192.168.2.108/hot/"}, "Kartendaten: © OpenStreetMap-Mitwirkende, SRTM | Kartendarstellung: © OpenTopoMap (CC-BY-SA)");
171-
//mMapView.setTileSource(localTopo);
187+
mMapView.addMapListener(new DelayedMapListener(mDragListener));
172188

173-
String copyRightNotice = mMapView.getTileProvider().getTileSource().getCopyrightNotice();
174-
TextView copyRightView = view.findViewById(R.id.copyrightView);
189+
mCopyRightView = view.findViewById(R.id.copyrightView);
175190

176-
if (!TextUtils.isEmpty(copyRightNotice)) {
177-
copyRightView.setText(copyRightNotice);
178-
copyRightView.setVisibility(View.VISIBLE);
179-
} else {
180-
copyRightView.setVisibility(View.GONE);
181-
}
182-
183-
mMapView.addMapListener(new DelayedMapListener(mDragListener));
191+
setBaseMap();
184192

185193
mLocationOverlay.enableMyLocation();
186194
mLocationOverlay.enableFollowLocation();
187195
mLocationOverlay.setOptionsMenuEnabled(true);
188196
mCompassOverlay.enableCompass();
189197
mMapView.setVisibility(View.VISIBLE);
190198
mOverlayHelper = new OverlayHelper(getActivity(), mMapView);
199+
200+
setTilesOverlay();
191201
}
192202

193203
return view;
@@ -216,6 +226,51 @@ public void run() {
216226
}
217227
}
218228

229+
private void setBaseMap() {
230+
switch (mBaseMap) {
231+
case BASE_MAP_OTM:
232+
mMapView.setTileSource(TileSourceFactory.OpenTopo);
233+
break;
234+
case BASE_MAP_OSM:
235+
mMapView.setTileSource(TileSourceFactory.MAPNIK);
236+
break;
237+
}
238+
mMapView.invalidate();
239+
240+
//final OnlineTileSourceBase localTopo = new XYTileSource("OpenTopoMap", 0, 19, 256, ".png",
241+
// new String[]{"http://192.168.2.108/hot/"}, "Kartendaten: © OpenStreetMap-Mitwirkende, SRTM | Kartendarstellung: © OpenTopoMap (CC-BY-SA)");
242+
//mMapView.setTileSource(localTopo);
243+
244+
setCopyrightNotice();
245+
}
246+
247+
private void setTilesOverlay() {
248+
mOverlayHelper.setTilesOverlay(mOverlay);
249+
setCopyrightNotice();
250+
}
251+
252+
private void setCopyrightNotice() {
253+
254+
StringBuilder copyrightStringBuilder = new StringBuilder();
255+
String mapCopyRightNotice = mMapView.getTileProvider().getTileSource().getCopyrightNotice();
256+
copyrightStringBuilder.append(mapCopyRightNotice);
257+
if (mOverlayHelper != null) {
258+
String overlayCopyRightNotice = mOverlayHelper.getCopyrightNotice();
259+
if (!TextUtils.isEmpty(mapCopyRightNotice) && !TextUtils.isEmpty(overlayCopyRightNotice)) {
260+
copyrightStringBuilder.append(", ");
261+
}
262+
copyrightStringBuilder.append(overlayCopyRightNotice);
263+
}
264+
String copyRightNotice = copyrightStringBuilder.toString();
265+
266+
if (!TextUtils.isEmpty(copyRightNotice)) {
267+
mCopyRightView.setText(copyRightNotice);
268+
mCopyRightView.setVisibility(View.VISIBLE);
269+
} else {
270+
mCopyRightView.setVisibility(View.GONE);
271+
}
272+
}
273+
219274
@SuppressLint("MissingPermission")
220275
private void initMap() {
221276

@@ -403,21 +458,85 @@ public boolean onOptionsItemSelected(MenuItem item) {
403458
zoomToBounds(Util.area(mListener.getGpx()));
404459
return true;
405460
case R.id.action_layers:
406-
View anchorView = getActivity().findViewById(R.id.popupAnchorView);
407-
PopupMenu popup = new PopupMenu(getActivity(), anchorView);
408-
android.view.MenuInflater inflater = popup.getMenuInflater();
409-
inflater.inflate(R.menu.menu_tile_sources, popup.getMenu());
461+
if (getActivity() != null) {
462+
View anchorView = getActivity().findViewById(R.id.popupAnchorView);
463+
PopupMenu popup = new PopupMenu(getActivity(), anchorView);
464+
android.view.MenuInflater inflater = popup.getMenuInflater();
465+
inflater.inflate(R.menu.menu_tile_sources, popup.getMenu());
466+
467+
MenuItem openTopoMapItem = popup.getMenu().findItem(R.id.otm);
468+
MenuItem openStreetMapItem = popup.getMenu().findItem(R.id.osm);
469+
MenuItem overlayNoneItem = popup.getMenu().findItem(R.id.none);
470+
MenuItem overlayHikingItem = popup.getMenu().findItem(R.id.lonvia_hiking);
471+
MenuItem overlayCyclingItem = popup.getMenu().findItem(R.id.lonvia_cycling);
472+
473+
switch (mBaseMap) {
474+
case BASE_MAP_OTM:
475+
openTopoMapItem.setChecked(true);
476+
break;
477+
case BASE_MAP_OSM:
478+
openStreetMapItem.setChecked(true);
479+
break;
480+
}
410481

411-
MenuItem openTopoItem = popup.getMenu().findItem(R.id.otm);
412-
openTopoItem.setChecked(true);
482+
switch (mOverlay) {
483+
case OverlayHelper.OVERLAY_NONE:
484+
overlayNoneItem.setChecked(true);
485+
break;
486+
case OverlayHelper.OVERLAY_HIKING:
487+
overlayHikingItem.setChecked(true);
488+
break;
489+
case OverlayHelper.OVERLAY_CYCLING:
490+
overlayCyclingItem.setChecked(true);
491+
break;
492+
}
493+
494+
popup.setOnMenuItemClickListener(MapFragment.this);
495+
popup.show();
496+
return true;
497+
} else {
498+
return false;
499+
}
413500

414-
popup.setOnMenuItemClickListener(MapFragment.this);
415-
popup.show();
416-
return true;
417501
}
418502
return super.onOptionsItemSelected(item);
419503
}
420504

505+
/**
506+
* Popup menu click
507+
*
508+
* @param menuItem
509+
* @return
510+
*/
511+
@Override
512+
public boolean onMenuItemClick(MenuItem menuItem) {
513+
if (!menuItem.isChecked()) {
514+
menuItem.setChecked(true);
515+
switch (menuItem.getItemId()) {
516+
case R.id.otm:
517+
mBaseMap = BASE_MAP_OTM;
518+
break;
519+
case R.id.osm:
520+
mBaseMap = BASE_MAP_OSM;
521+
break;
522+
case R.id.none:
523+
mOverlay = OverlayHelper.OVERLAY_NONE;
524+
break;
525+
case R.id.lonvia_hiking:
526+
mOverlay = OverlayHelper.OVERLAY_HIKING;
527+
break;
528+
case R.id.lonvia_cycling:
529+
mOverlay = OverlayHelper.OVERLAY_CYCLING;
530+
break;
531+
}
532+
mPrefs.edit().putInt(PREF_BASE_MAP, mBaseMap).apply();
533+
mPrefs.edit().putInt(PREF_OVERLAY, mOverlay).apply();
534+
setBaseMap();
535+
setTilesOverlay();
536+
}
537+
return true;
538+
}
539+
421540
@Override
422541
public void onLocationChanged(Location location) {
423542
mCurrentLocation = location;
@@ -464,16 +583,8 @@ public void onDestroy() {
464583
mCompassOverlay = null;
465584
mScaleBarOverlay = null;
466585
mRotationGestureOverlay = null;
467-
}
586+
mOverlayHelper.destroy();
468587

469-
/**
470-
* Popup menu click
471-
* @param menuItem
472-
* @return
473-
*/
474-
@Override
475-
public boolean onMenuItemClick(MenuItem menuItem) {
476-
return false;
477588
}
478589

479590
public interface OnFragmentInteractionListener {

app/src/main/java/org/nitri/opentopo/overlay/OverlayHelper.java

Lines changed: 86 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,20 @@
11
package org.nitri.opentopo.overlay;
22

33
import android.content.Context;
4+
import android.graphics.Color;
5+
import android.graphics.ColorMatrix;
6+
import android.graphics.ColorMatrixColorFilter;
47
import android.support.v4.content.ContextCompat;
58

69
import org.nitri.opentopo.R;
10+
import org.osmdroid.tileprovider.MapTileProviderBasic;
11+
import org.osmdroid.tileprovider.tilesource.ITileSource;
12+
import org.osmdroid.tileprovider.tilesource.XYTileSource;
713
import org.osmdroid.util.GeoPoint;
814
import org.osmdroid.views.MapView;
915
import org.osmdroid.views.overlay.ItemizedIconOverlay;
1016
import org.osmdroid.views.overlay.OverlayItem;
17+
import org.osmdroid.views.overlay.TilesOverlay;
1118
import org.osmdroid.views.overlay.infowindow.BasicInfoWindow;
1219

1320
import java.util.ArrayList;
@@ -19,11 +26,28 @@
1926

2027
public class OverlayHelper {
2128

22-
Context mContext;
23-
MapView mMapView;
29+
private Context mContext;
30+
private MapView mMapView;
2431

2532
private ItemizedIconInfoOverlay mWayPointOverlay;
2633

34+
/** Tiles Overlays */
35+
public final static int OVERLAY_NONE = 1;
36+
public final static int OVERLAY_HIKING = 2;
37+
public final static int OVERLAY_CYCLING = 3;
38+
39+
private int mOverlay = OVERLAY_NONE;
40+
private MapTileProviderBasic mOverlayTileProvider;
41+
private TilesOverlay mTilesOverlay;
42+
43+
private ColorMatrix tileOverlayAlphaMatrix = new ColorMatrix(new float[]
44+
{ 1, 0, 0, 0, 0,
45+
0, 1, 0, 0, 0,
46+
0, 0, 1, 0, 0,
47+
0, 0, 0, 0.8f, 0 }
48+
);
49+
private ColorMatrixColorFilter tileOverlayAlphaFilter = new ColorMatrixColorFilter(tileOverlayAlphaMatrix);
50+
2751
private ItemizedIconOverlay.OnItemGestureListener<OverlayItem> mWayPointItemGestureListener = new ItemizedIconOverlay.OnItemGestureListener<OverlayItem>() {
2852

2953
@Override
@@ -115,4 +139,64 @@ public boolean hasGpx() {
115139
return mTrackOverlay != null || mWayPointOverlay != null;
116140
}
117141

142+
public void setTilesOverlay(int overlay) {
143+
mOverlay = overlay;
144+
145+
ITileSource overlayTiles = null;
146+
147+
if (mTilesOverlay != null) {
148+
mMapView.getOverlays().remove(mTilesOverlay);
149+
}
150+
151+
switch (mOverlay) {
152+
case OVERLAY_NONE:
153+
break;
154+
case OVERLAY_HIKING:
155+
overlayTiles = new XYTileSource("hiking", 1, 17, 256, ".png",
156+
new String[]{
157+
"https://tile.waymarkedtrails.org/hiking/"}, mContext.getString(R.string.lonvia_copy));
158+
break;
159+
case OVERLAY_CYCLING:
160+
overlayTiles = new XYTileSource("cycling", 1, 17, 256, ".png",
161+
new String[]{
162+
"https://tile.waymarkedtrails.org/cycling/"}, mContext.getString(R.string.lonvia_copy));
163+
break;
164+
}
165+
if (overlayTiles != null) {
166+
mOverlayTileProvider = new MapTileProviderBasic(mContext);
167+
mOverlayTileProvider.setTileSource(overlayTiles);
168+
mTilesOverlay = new TilesOverlay(mOverlayTileProvider, mContext);
169+
mTilesOverlay.setLoadingBackgroundColor(Color.TRANSPARENT);
170+
mTilesOverlay.setColorFilter(tileOverlayAlphaFilter);
171+
mOverlayTileProvider.setTileRequestCompleteHandler(mMapView.getTileRequestCompleteHandler());
172+
173+
mMapView.getOverlays().add(mTilesOverlay);
174+
175+
if (mTrackOverlay != null) {
176+
// move track up
177+
mMapView.getOverlays().remove(mTrackOverlay);
178+
mMapView.getOverlays().add(mTrackOverlay);
179+
}
180+
}
181+
mMapView.invalidate();
182+
}
183+
184+
/**
185+
* Copyright notice for the tile overlay
186+
*
187+
* @return copyright notice or null
188+
*/
189+
public String getCopyrightNotice() {
190+
if (mOverlayTileProvider != null && mOverlay != OVERLAY_NONE) {
191+
return mOverlayTileProvider.getTileSource().getCopyrightNotice();
192+
}
193+
return null;
194+
}
195+
196+
public void destroy() {
197+
mTilesOverlay = null;
198+
mOverlayTileProvider = null;
199+
mWayPointOverlay = null;
200+
}
201+
118202
}

app/src/main/java/org/nitri/opentopo/overlay/TrackOverlay.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,10 @@
2222

2323
public class TrackOverlay extends Overlay {
2424

25-
Track mTrack;
26-
Context mContext;
25+
private Track mTrack;
26+
private Context mContext;
2727

28-
List<List<Point>> mPointsSegments = new ArrayList<>();
28+
private List<List<Point>> mPointsSegments = new ArrayList<>();
2929

3030
private static final String TAG = TrackOverlay.class.getSimpleName();
3131

@@ -50,6 +50,7 @@ public void draw(Canvas canvas, MapView osmv, boolean shadow) {
5050
routePaint = new Paint();
5151
routePaint.setColor(ContextCompat.getColor(mContext, R.color.colorTrack));
5252
routePaint.setAntiAlias(true);
53+
routePaint.setAlpha(204);
5354
routePaint.setStyle(Paint.Style.STROKE);
5455
routePaint.setStrokeJoin(Paint.Join.ROUND);
5556
routePaint.setStrokeCap(Paint.Cap.ROUND);

app/src/main/res/layout/fragment_gpx_detail.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@
4848
android:layout_width="match_parent"
4949
android:layout_height="wrap_content"
5050
android:gravity="center"
51-
5251
tools:text="Description" />
5352

5453
</FrameLayout>

0 commit comments

Comments
 (0)