Google Mapに標準のマーカーとは別のアイコンを使うとか、あるいはズームでマップ表示させるにはどうするかやってみました。
2021.2.1
Google Maps Activity
project の新規作成にて Google Maps Activity を選択することで、すぐにmapを表示できるコードが生成されKeyを入れればすぐにできます。Google Mapプロジェクトの作成はこちらを参考にしてください。
作成したプロジェクトに、OnMapReadyCallbackに緯度経度を入れれば、そのロケーションをマーカーを付けて表示できます。
1 2 3 4 5 6 7 8 9 |
@Override public void onMapReady(GoogleMap googleMap) { mMap = googleMap; // Add a marker in Sydney and move the camera LatLng sydney = new LatLng(-34, 151); mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney")); mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney)); } |
シドニーにマークされたマップが表示されますが、皇居付近に緯度経度を変えて、更にズームアップしてみます。
また標準のマーカーをアイコン画像に変更するとこうなります。
マーカーアイコンはbitmapの画像を作ってdrawableに入れておきます。
MapsActivity.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 |
//package your.package.name; import androidx.fragment.app.FragmentActivity; import android.os.Bundle; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.OnMapReadyCallback; import com.google.android.gms.maps.SupportMapFragment; import com.google.android.gms.maps.model.BitmapDescriptor; import com.google.android.gms.maps.model.BitmapDescriptorFactory; import com.google.android.gms.maps.model.GroundOverlay; import com.google.android.gms.maps.model.GroundOverlayOptions; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.LatLngBounds; import com.google.android.gms.maps.model.MarkerOptions; import com.example.testgooglemapzoom.databinding.ActivityMapsBinding; public class MapsActivity extends FragmentActivity implements OnMapReadyCallback { private GoogleMap mMap; private ActivityMapsBinding binding; private LatLng latlng; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = ActivityMapsBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); // Obtain the SupportMapFragment and get notified when the map is ready to be used. SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() .findFragmentById(R.id.map); mapFragment.getMapAsync(this); } /** * Manipulates the map once available. * This callback is triggered when the map is ready to be used. * This is where we can add markers or lines, add listeners or move the camera. In this case, * we just add a marker near Sydney, Australia. * If Google Play services is not installed on the device, the user will be prompted to install * it inside the SupportMapFragment. This method will only be triggered once the user has * installed Google Play services and returned to the app. */ @Override public void onMapReady(GoogleMap googleMap) { mMap = googleMap; // 皇居近辺の緯度経度 double latitude = 35.68; double longitude = 139.76; latlng = new LatLng(latitude, longitude); // 標準のマーカー //setMarker(latitude, longitude); // アイコン画像をマーカーに設定 setIcon(latitude, longitude); } private void setMarker(double latitude, double longitude){ MarkerOptions markerOptions = new MarkerOptions(); markerOptions.position(latlng); markerOptions.title("Marker"); mMap.addMarker(markerOptions); // ズーム zoomMap(latitude, longitude); } private void setIcon(double latitude, double longitude){ // マップに貼り付ける BitmapDescriptor生成 // 画像は自分で適当に用意します。ここではmipmapから持ってきましたが BitmapDescriptor descriptor = BitmapDescriptorFactory.fromResource(R.drawable.droid_round); // 貼り付設定 GroundOverlayOptions overlayOptions = new GroundOverlayOptions(); overlayOptions.image(descriptor); // public GroundOverlayOptions anchor (float u, float v) // (0,0):top-left, (0,1):bottom-left, (1,0):top-right, (1,1):bottom-right overlayOptions.anchor(0.5f, 0.5f); // 張り付け画像の大きさ メートル単位 // public GroundOverlayOptions position(LatLng location, float width, float height) overlayOptions.position(latlng, 300f, 300f); // マップに貼り付け・アルファを設定 GroundOverlay overlay = mMap.addGroundOverlay(overlayOptions); // ズーム zoomMap(latitude, longitude); // 透明度 assert overlay != null; overlay.setTransparency(0.0F); } private void zoomMap(double latitude, double longitude){ // 表示する東西南北の緯度経度を設定 double south = latitude * (1-0.00005); double west = longitude * (1-0.00005); double north = latitude * (1+0.00005); double east = longitude * (1+0.00005); // LatLngBounds (LatLng southwest, LatLng northeast) LatLngBounds bounds = LatLngBounds.builder() .include(new LatLng(south , west)) .include(new LatLng(north, east)) .build(); int width = getResources().getDisplayMetrics().widthPixels; int height = getResources().getDisplayMetrics().heightPixels; // static CameraUpdate.newLatLngBounds(LatLngBounds bounds, int width, int height, int padding) mMap.moveCamera(CameraUpdateFactory. newLatLngBounds(bounds, width, height, 0)); } } |
local.propertiesに記述
1 2 3 4 5 |
## This file is automatically generated by Android Studio. ... sdk.dir=C\:\\Users\\akira\\AppData\\Local\\Android\\Sdk MAPS_API_KEY=AIzaISyBC4N47_xxxxxxxxxxxxxxxxxxxHiRwU |
AndroidManifest.xml のYOUR_API_KEY を{MAPS_API_KEY}に置き換え
1 2 3 |
<meta-data android:name="com.google.android.geo.API_KEY" android:value="${MAPS_API_KEY}" /> |
ズームさせマーカーをアイコンに変更すると
ズームとしてはnewLatLngZoomを使えます
1 |
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latlng, 15f)); |
関連ページ:
- Google Map API キー取得
- Google Map 簡単に地図を表示させる
- Google Map ズームとアイコン画像貼り付け
- Google Map タップして移動、マーカーの追加
- Intentでの簡単な Google Map 地図の表示
- Google Map 移動経路
References:
API キーの取得 | Google Maps Android API | Google Developers
スタートガイド | Google Maps Android API | Google Developers
GitHub の Google マップ リポジトリ
Google Maps Android API – Google Developers
OnMapReadyCallback | Google APIs for Android | Google Developers