アプリケーションでGoogle Map API v2
を使用してマップを表示しています。
アプリケーションでGoogleマップを有効にするために従うべきすべての手順を実行しました。
public class PinLocationOnMapView extends FragmentActivity {
private double mLatitude = 0.0, mLongitude = 0.0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SupportMapFragment fragment = SupportMapFragment.newInstance();
getSupportFragmentManager().beginTransaction()
.add(Android.R.id.content, fragment).commit();
}
}
このコードを使用すると、マップが表示されますが、緯度/経度の値を指定すると、マップタイルは読み込まれず、白いタイルのみが表示されます。
上記のクラスのonCreate()で記述されたコードは次のとおりです。
if (getIntent().getExtras() != null) {
final Bundle bundle = getIntent().getBundleExtra("LOCATION");
mLatitude = bundle.getDouble("LATITUDE");
mLongitude = bundle.getDouble("LONGITUDE");
} else {
finish();
}
GoogleMapOptions options = new GoogleMapOptions();
LatLng latLng = new LatLng(mLatitude, mLongitude);
CameraPosition cameraPosition;// = new CameraPosition(latLng, 0, 0, 0);
cameraPosition = CameraPosition.fromLatLngZoom(latLng, (float) 14.0);
options.mapType(GoogleMap.MAP_TYPE_SATELLITE).camera(cameraPosition)
.zoomControlsEnabled(true).zoomGesturesEnabled(true);
SupportMapFragment fragment = SupportMapFragment.newInstance(options);
getSupportFragmentManager().beginTransaction()
.add(Android.R.id.content, fragment).commit();
また、lat/long値のリストがあります。 MapFragment
に表示したいのですが、MapFragment
に複数のマーカーを表示する方法?
MapView
とItemizedOverlay
で試しましたが、うまくいきませんでした。 SHA1
キーを正しく作成してAPI
キーを取得したと思います。それが間違っていた場合、MapFragment
を使用してマップを表示できませんでしたが、 lat/log値を渡さないでください。
異なる色のマーカーで地図上に車の位置を表示するには、次のようにします。
_ private void addMarkersToMap() {
mMap.clear();
for (int i = 0; i < Cars.size(); i++) {
LatLng ll = new LatLng(Cars.get(i).getPos().getLat(), Cars.get(i).getPos().getLon());
BitmapDescriptor bitmapMarker;
switch (Cars.get(i).getState()) {
case 0:
bitmapMarker = BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED);
Log.i(TAG, "RED");
break;
case 1:
bitmapMarker = BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN);
Log.i(TAG, "GREEN");
break;
case 2:
bitmapMarker = BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_ORANGE);
Log.i(TAG, "ORANGE");
break;
default:
bitmapMarker = BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED);
Log.i(TAG, "DEFAULT");
break;
}
mMarkers.add(mMap.addMarker(new MarkerOptions().position(ll).title(Cars.get(i).getName())
.snippet(getStateString(Cars.get(i).getState())).icon(bitmapMarker)));
Log.i(TAG,"Car number "+i+" was added " +mMarkers.get(mMarkers.size()-1).getId());
}
}
}
_
CarsはArrayList
のカスタムオブジェクトであり、mMarkersはArrayList
のマーカーです。
注:このようにフラグメントでマップを表示できます:
_private GoogleMap mMap;
....
private void setUpMapIfNeeded() {
// Do a null check to confirm that we have not already instantiated the
// map.
if (mMap == null) {
// Try to obtain the map from the SupportMapFragment.
mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
// Check if we were successful in obtaining the map.
if (mMap != null) {
setUpMap();
}
}
}
private void setUpMap() {
// Hide the zoom controls as the button panel will cover it.
mMap.getUiSettings().setZoomControlsEnabled(false);
// Add lots of markers to the map.
addMarkersToMap();
// Setting an info window adapter allows us to change the both the
// contents and look of the
// info window.
mMap.setInfoWindowAdapter(new CustomInfoWindowAdapter());
// Set listeners for marker events. See the bottom of this class for
// their behavior.
mMap.setOnMarkerClickListener(this);
mMap.setOnInfoWindowClickListener(this);
mMap.setOnMarkerDragListener(this);
// Pan to see all markers in view.
// Cannot zoom to bounds until the map has a size.
final View mapView = getSupportFragmentManager().findFragmentById(R.id.map).getView();
if (mapView.getViewTreeObserver().isAlive()) {
mapView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@SuppressLint("NewApi")
// We check which build version we are using.
@Override
public void onGlobalLayout() {
LatLngBounds.Builder bld = new LatLngBounds.Builder();
for (int i = 0; i < mAvailableCars.size(); i++) {
LatLng ll = new LatLng(Cars.get(i).getPos().getLat(), Cars.get(i).getPos().getLon());
bld.include(ll);
}
LatLngBounds bounds = bld.build();
mMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 70));
mapView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
});
}
}
_
setUpMapIfNeeded()
でonCreate()
を呼び出すだけです
GeoCoderを使用して住所(例:123 Street Street Lodi ca)をLatLngに変換するときに、マップに複数のマーカーを追加するには、以下のサンプルコードが機能します。
// convert address to lng lat and add markers to map
public void addMarkersToMap() {
mMap.clear();
Double[] latitude = new Double[addressArrayList.size()];
Double[] longitude = new Double[addressArrayList.size()];
String[] addrs = new String[addressArrayList.size()];
addrs = addressArrayList.toArray(addrs);
List<Address> addressList;
if (addrs != null && addrs.length > 0) {
for (int i = 0; i < addrs.length; i++) {
try {
addressList = geoCoder.getFromLocationName(addrs[i], 1);
if (addressList == null || addressList.isEmpty() || addressList.equals("")) {
addressList = geoCoder.getFromLocationName("san francisco", 1);
}
latitude[i] = addressList.get(0).getLatitude();
longitude[i] = addressList.get(0).getLongitude();
System.out.println("latitude = " + latitude[i] + " longitude = " + longitude[i]);
mMap.addMarker(new MarkerOptions()
.position(new LatLng(latitude[i], longitude[i]))
.title(namesArrayList.get(i))
.snippet(addressArrayList.get(i))
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_Azure))
.alpha(0.7f)
);
} catch (Exception e) {
e.printStackTrace();
} // end catch
}
}
} //end addMarkersToMap
私は多分あなたがコードを修正し、今では大丈夫だとは知りませんが、onCreate()
if (getIntent().getExtras() != null) {
final Bundle bundle = getIntent().getBundleExtra("LOCATION");
mLatitude = bundle.getDouble("LATITUDE");
mLatitude = bundle.getDouble("LONGITUDE");
}
2番目のmLatitude
は、次の行で呼び出すようにmLongitude
である必要があると思います。
返事が遅れて役に立たない場合は申し訳ありません。
これを試すことができます:
public double getDistanceinKm(double lat1, double long1, double lat2, double long2) {
Location startPoint = new Location("locationA");
startPoint.setLatitude(lat1);
startPoint.setLongitude(long1);
Location endPoint = new Location("locationA");
endPoint.setLatitude(lat2);
endPoint.setLongitude(long2);
double distanceInKiloMeters = startPoint.distanceTo(endPoint) / 1000;
return distanceInKiloMeters;
}
Webサイトのルートディレクトリにあるxmlファイルを呼び出すこのコードを試してください-
マーカーを追加する1つの方法は、マーカーhtmlを含むルートディレクトリ(以下のコードを参照)にあるxmlファイルをロードすることです。
ここのコードは、マップスペースとサイドバー列を設定して、マーカーとマップとリンクを保持します。 htmlタグとマップアイテムのidとサイドバーtd idの両方のdivタグに注意してください。
マーカーを設定できますが、正しくタグ付けする必要がある特殊文字を使用する必要があることに注意してください。たとえば、アンパサンド(&)は実際には「&」+「amp」+「;」としてコーディングする必要があります(引用符なし)。同じことは、より大きい文字とより小さい文字などにも当てはまります。複数のマーカーがある場合は面倒ですが、一度配置すれば、ビルドする必要のあるアセンブリやアプリ内でコーディングする必要がないため、簡単に変更できます。ファイルを読み取るスクリプトでは、CDATAタグを使用すると、技術的に特殊文字表現を使用する必要がなくなりますが、Gmaps API v2では、とにかくそれらを使用します。私の例では、xmlファイル名はexample3.xmlです。
次のようにxmlをフォーマットできます。
<Markers>
<marker lat="47.881389" lng="-122.242222"
html='<div style="background-color:#FFFF88;font-family:Tahoma; font-size:12px;padding:6px; border:solid 1px black;"><b>SiteLines Park & Playground Products</b> <br>626 128th Street SW<br>Suite 104-A<br>Everett‚ WA 98204<br>Phone: (425) 355-5655<br><b>Toll Free: (800) 541-0869</b><br>Fax: (425) 347-3056<br>Email: <a href="mailto:[email protected]" target="blank">emailus@sitelines.com</a><br>Web: <a href="http://www.sitelines.com" target="blank">www.sitelines.com</a> </div>'label="SiteLines Park & Playground Products" />
</Markers>
And for the html and script:
<form style="background-color: #ffffff;" id="form1" runat="server">
<div style="text-align: center;">
<table style="border: 1px currentColor; vertical-align: middle;">
<tbody>
<tr>
<td style="background-color: #bbcae3; vertical-align: top;">
<div style="background-color: #e4e4e4; font-family: Tahoma; font-size: 12px; line-height: 22px; padding: 5px; text-decoration: underline; width: 210px; color: #000000; text-align: left;" id="side_bar"></div>
</td>
<td>
<div style="height: 600px; width: 600px;" id="map"></div>
</td>
</tr>
</tbody>
</table>
</div>
</form>
<script type="text/javascript" src="http://maps.google.com/maps?file=api&v=2&key=ABQIAAAAyUoL7QQqyBn6qU653XJGLxSjEdRKL8ahnZ9z8zIKzjlyzNOP2RRCsKP_vlAEzWT8jzEKS0_9RrXOAg"></script>
<script type="text/javascript">// <![CDATA[
if (GBrowserIsCompatible()) {
// this variable will collect the html which will eventualy be placed in the side_bar
var side_bar_html = "";
// arrays to hold copies of the markers and html used by the side_bar
// because the function closure trick doesnt work there
var gmarkers = [];
var htmls = [];
var i = 0;
// A function to create the marker and set up the event window
function createMarker(point, name, html) {
var marker = new GMarker(point);
GEvent.addListener(marker, "click", function() {
marker.openInfoWindowHtml(html);
});
// save the info we need to use later for the side_bar
gmarkers[i] = marker;
htmls[i] = html;
// add a line to the side_bar html
side_bar_html += '<a href="javascript:myclick(' + (gmarkers.length-1) + ')">' + name + '<\/a><br>';
i++;
return marker;
}
// This function picks up the click and opens the corresponding info window
function myclick(i) {
gmarkers[i].openInfoWindowHtml(htmls[i]);
}
// create the map
var map = new GMap2(document.getElementById("map"));
map.addControl(new GLargeMapControl());
map.addControl(new GMapTypeControl());
map.setCenter(new GLatLng(0, 0), 0);
//
// ===== Start with an empty GLatLngBounds object =====
var bounds = new GLatLngBounds();
// Read the data from example3.xml
GDownloadUrl("/testStore/example3.xml", function(doc) {
var xmlDoc = GXml.parse(doc);
var markers = xmlDoc.documentElement.getElementsByTagName("marker");
for (var i = 0; i < markers.length; i++) {
// obtain the attribues of each marker
var lat = parseFloat(markers[i].getAttribute("lat"));
var lng = parseFloat(markers[i].getAttribute("lng"));
var point = new GLatLng(lat, lng);
var html = markers[i].getAttribute("html");
var label = markers[i].getAttribute("label");
// create the marker
var marker = createMarker(point, label, html);
map.addOverlay(marker);
}
// put the assembled side_bar_html contents into the side_bar div
document.getElementById("side_bar").innerHTML = side_bar_html;
});
}
else {
alert("Sorry, the Google Maps API is not compatible with this browser");
}
// This Javascript is based on code provided by the
// Blackpool Community Church Javascript Team
// http://www.commchurch.freeserve.co.uk/
// http://econym.googlepages.com/index.htm
//]]>
最初のcraeteメソッドsetupDestationLocation
public void setupDestationLocation(double longlat, double latitue, String title) {
LatLng Shop = new LatLng(longlat, latitue);
/* if (DestinationMarker != null) {
DestinationMarker.remove();
}*/
DestinationMarker = mMap.addMarker(new MarkerOptions()
.position(Shop)
.title(market_n)
.title(title)
.icon(BitmapDescriptorFactory.fromResource(R.mipmap.ic_marker_shop)));
CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(Shop, 14);
mMap.animateCamera(cameraUpdate);
}
メソッド内のメソッドを呼び出すだけです(onMapReady)
String title = "market";
for(int i = 0 ; i < 8 ; i++ ) {
double offset = i / 08d;
setupDestationLocation(longlat+offset,latitue,title+i);
}