Skip to content

Instantly share code, notes, and snippets.

@junichim
Last active May 30, 2017 07:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save junichim/b864b1b7a49e94a18e41fb2cefa32524 to your computer and use it in GitHub Desktop.
Save junichim/b864b1b7a49e94a18e41fb2cefa32524 to your computer and use it in GitHub Desktop.
mapsforgeサンプル

ファイル追加のテスト

うまくいくかな?

ファイルの並びの法則は? アルファベット順とも違うようだ。 ちょっとわからんなー。

package com.example.mapsforgesample;
import android.Manifest;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.os.Environment;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import org.mapsforge.core.graphics.Bitmap;
import org.mapsforge.core.model.LatLong;
import org.mapsforge.core.model.Point;
import org.mapsforge.map.android.graphics.AndroidGraphicFactory;
import org.mapsforge.map.android.util.AndroidUtil;
import org.mapsforge.map.android.view.MapView;
import org.mapsforge.map.datastore.MapDataStore;
import org.mapsforge.map.layer.cache.TileCache;
import org.mapsforge.map.layer.overlay.Marker;
import org.mapsforge.map.layer.renderer.TileRendererLayer;
import org.mapsforge.map.reader.MapFile;
import org.mapsforge.map.rendertheme.InternalRenderTheme;
import java.io.File;
/** mapsforge の地図表示サンプル
*
* https://github.com/mapsforge/mapsforge/blob/master/docs/Getting-Started-Android-App.md
*/
public class MainActivity extends AppCompatActivity {
private final static String TAG = MainActivity.class.getSimpleName();
private final static String MAP_FILE = "japan_multi.map";
private final static int PERMISSION_REQUEST_CODE = 1;
private MapView mapView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AndroidGraphicFactory.createInstance(this.getApplication());
mapView = new MapView(this);
setContentView(mapView);
mapView.setClickable(true);
mapView.getMapScaleBar().setVisible(true);
mapView.setBuiltInZoomControls(true);
mapView.setZoomLevelMin((byte)10);
mapView.setZoomLevelMax((byte)20);
//Log.d(TAG, "externalDir: " + Environment.getExternalStorageDirectory());
// targetSDK 23 以上の場合、実行時にパーミッション確認を行う必要がある
// https://stackoverflow.com/questions/8854359/exception-open-failed-eacces-permission-denied-on-android
// https://developer.android.com/training/permissions/requesting.html
final int permission = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE);
if (permission != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, PERMISSION_REQUEST_CODE);
} else {
displayMap();
}
}
@Override
protected void onDestroy() {
mapView.destroyAll();;
AndroidGraphicFactory.clearResourceMemoryCache();
super.onDestroy();
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch(requestCode) {
case PERMISSION_REQUEST_CODE:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
displayMap();
return;
}
default:
}
// アプリを終了
this.finish();
}
private void displayMap() {
TileCache tileCache = AndroidUtil.createTileCache(this, "mapcache", mapView.getModel().displayModel.getTileSize(), 1f, mapView.getModel().frameBufferModel.getOverdrawFactor() );
MapDataStore mds = new MapFile(new File(Environment.getExternalStorageDirectory() + "/Download/", MAP_FILE));
TileRendererLayer trl = new TileRendererLayer(tileCache, mds, mapView.getModel().mapViewPosition, AndroidGraphicFactory.INSTANCE) {
@Override
public boolean onLongPress(LatLong tapLatLong, Point layerXY, Point tapXY) {
return setMarker(tapLatLong);
}
};
trl.setXmlRenderTheme(InternalRenderTheme.DEFAULT);
mapView.getLayerManager().getLayers().add(trl);
mapView.setCenter(new LatLong(34.491297, 136.709685)); // 伊勢市駅
mapView.setZoomLevel((byte)12);
}
private boolean setMarker(LatLong latlong) {
// Marker marker = createMarker(latlong, R.drawable.marker_red);
Marker marker = createBubbleMarker(latlong, R.drawable.marker_red, "ポップアップテスト");
mapView.getLayerManager().getLayers().add(marker);
return true;
}
private Marker createMarker(LatLong latlong, int resource) {
Drawable drawable = getResources().getDrawable(resource);
Bitmap bitmap = AndroidGraphicFactory.convertToBitmap(drawable);
return new Marker(latlong, bitmap, 0, -bitmap.getHeight() / 2);
}
private Marker createBubbleMarker(LatLong latlong, int resource, String text) {
Drawable drawable = getResources().getDrawable(resource);
Bitmap bitmap = AndroidGraphicFactory.convertToBitmap(drawable);
return new MarkerWithBubble(latlong, bitmap, 0, -bitmap.getHeight() / 2, this.mapView, text);
}
}
package com.example.mapsforgesample;
import android.content.Context;
import android.graphics.Color;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import org.mapsforge.core.graphics.Bitmap;
import org.mapsforge.core.model.LatLong;
import org.mapsforge.core.model.Point;
import org.mapsforge.map.android.view.MapView;
import org.mapsforge.map.layer.overlay.Marker;
/**
* Created by mor on 2017/05/29.
*/
public class MarkerWithBubble extends Marker {
private static final String TAG = MarkerWithBubble.class.getSimpleName();
private static final int BALLOON_VERTICAL_OFFSET = 100;
private static final int DEFAULT_TEXT_SIZE = 15;
private MapView mMapView;
private Marker mBalloonMarker;
private String mText;
private int mTextSize;
private int mColor;
/**
* @param latLong the initial geographical coordinates of this marker (may be null).
* @param bitmap the initial {@code Bitmap} of this marker (may be null).
* @param horizontalOffset the horizontal marker offset.
* @param verticalOffset the vertical marker offset.
*/
public MarkerWithBubble(LatLong latLong, Bitmap bitmap, int horizontalOffset, int verticalOffset, MapView mapview, String text) {
super(latLong, bitmap, horizontalOffset, verticalOffset);
mMapView = mapview;
mText = text;
mColor = Color.BLACK;
mTextSize = DEFAULT_TEXT_SIZE;
mBalloonMarker = null;
}
public void setText(String text) {
mText = text;
}
public String getText() {
return mText;
}
public void setTextColor(int color) {
mColor = color;
}
public int getTextColor() {
return mColor;
}
public void setTextSize(int size) {
mTextSize = size;
}
public int getTextSize() {
return mTextSize;
}
@Override
public boolean onTap(LatLong geoPoint, Point viewPosition, Point tapPoint) {
Log.d(TAG, "LoaLong: " + geoPoint.getLatitude() + ", " + geoPoint.getLongitude());
Log.d(TAG, "viewPos: " + viewPosition.x + ", " + viewPosition.y);
Log.d(TAG, "tapPos : " + tapPoint.x + ", " + tapPoint.y);
if (contains(viewPosition, tapPoint)) {
Log.d(TAG, "contains: " + true);
if (! TextUtils.isEmpty(mText)) {
Log.d(TAG, "text is exist");
if (null == mBalloonMarker) {
Log.d(TAG, "balloon is null");
Bitmap bmp = createBalloon(mMapView.getContext());
mBalloonMarker = new Marker(MarkerWithBubble.this.getLatLong(), bmp, 0, - bmp.getHeight() / 2 - BALLOON_VERTICAL_OFFSET );
mMapView.getLayerManager().getLayers().add(mBalloonMarker);
} else {
if (null != mBalloonMarker) {
mBalloonMarker.setVisible(!mBalloonMarker.isVisible());
}
}
}
Log.d(TAG, "text is null");
} else {
Log.d(TAG, "contains: " + false);
if (null != mBalloonMarker) {
mBalloonMarker.setVisible(false);
}
}
return super.onTap(geoPoint, viewPosition, tapPoint);
}
private Bitmap createBalloon(Context c) {
TextView tv = (TextView) LayoutInflater.from(mMapView.getContext()).inflate(R.layout.popup_marker, null);
tv.setTextColor(mColor);
tv.setTextSize(mTextSize);
tv.setText(mText);
return Utils.viewToBitmap(c, tv);
}
}
package com.example.mapsforgesample;
import android.content.Context;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.view.View;
import org.mapsforge.core.graphics.Bitmap;
import org.mapsforge.map.android.graphics.AndroidGraphicFactory;
/**
* Created by mor on 2017/05/30.
*/
public class Utils {
public static Bitmap viewToBitmap(Context c, View view) {
view.measure(View.MeasureSpec.getSize(view.getMeasuredWidth()),
View.MeasureSpec.getSize(view.getMeasuredHeight()));
view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
view.setDrawingCacheEnabled(true);
Drawable drawable = new BitmapDrawable(c.getResources(),
android.graphics.Bitmap.createBitmap(view.getDrawingCache()));
view.setDrawingCacheEnabled(false);
return AndroidGraphicFactory.convertToBitmap(drawable);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment