I would like to center a route that is returned from google directions api on the screen? I have tried to use CameraUpdateFactory.newLatLngBounds but it seems to limit the user from moving to a certain part of the map.
All i would like to do is show the route centered on the screen rather than my current location?
Ok,
I managed to find a solution if anyone needs help with something similar. Although I am still trying to fix the calculating the zoom issue, where it doesn't zoom in to have the route fit in the screen as apposed to hard coding a zoom value
LatLng northEast = new LatLng(aBoundary.getNortheast().getLat(), aBoundary.getNortheast().getLng());
LatLng southWest = new LatLng(aBoundary.getSouthwest().getLat(), aBoundary.getSouthwest().getLng());
LatLngBounds latLngBounds = new LatLngBounds(southWest, northEast);
mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLngBounds.getCenter(), mGoogleMap.getCameraPosition().zoom));
the aBoundary object is the Bounds object that sits inside the Route object from the response.
Related
I'm trying to update the camera boundaries every time the zoom value changes. After checking the doc, I found that it's possible to extend the current boundaries by using method LatLngBounds Including(LatLng point) which return the smallest LatLngBounds that contains the LatLng point. So I made this code :
// I save the initial zoom value and I test if it changes
double zoom = mMap.getCameraPosition().zoom;
if (zoom!= mMap.getCameraPosition().zoom){
// I create a new Bounds which is proportional to the difference of the previous and the new zoom value by including a new point in the boundaries
LatLng chgtBounds = new LatLng(ParisBounds.getCenter().latitude+(mMap.getCameraPosition().zoom-zoom)*0.001,ParisBounds.getCenter().longitude+(mMap.getCameraPosition().zoom-zoom)*0.001);
zoom = mMap.getCameraPosition().zoom;
// I apply this new bounds on the map and it automatically delete the previous one
mMap.setLatLngBoundsForCameraTarget(ParisBounds.including(chgtBounds));
}
I create a new variable that save the zoom value to know when the user is zooming in the map. When he does it, a new boundaries is created by increasing the previous one by a thousandth of the zoom value (not sure it's the right fraction tho but the idea is the same). However, i think those lines are only executed once at the app's launching. Is there a way to execute them eternally ?
I tried a while(true) but then the app doesn't launch at all.
Current zoom level is obtained from:
mMap.getCameraPosition().zoom
See docs.
The max zoom (used in OP code) is the maximum possible zoom based on current camera position and tile type in use.
I get a lat long from the backend and I want to use a PNG as a map, because this map is self made. So I want to transfer my lat long on this PNG and then draw at this position a point, but I couldn't figure it out how to do...
I couldn't find it here in another question. Maybe it's so easy that no one ever asked this.
I am new to Android and new to stackoverflow :)
EDIT because of comment: The image is a self made map. It was made with ESRI cityengine and Blender. Then I made a birdseye-screenshot of the map and this screenshot I want to use as my map.
EDIT 2: #MarkusKauppinen made a good comment! So I also want to convert the lat/long to x/y coordinates of the screen (like (How do android screen coordinates work?) ). But the lat/long of my backend don't relate to the lat/long of the Earth.
Even thought that this question has a downvote and probably no one will ever see it, I could figure it out how to solve my problem.
I used this Canvas Bitmap Method to draw the map on my screen. Then I converted the lat/long coordinates so that they fit on the Screen of the mobile phone with the help of this post: How do android screen coordinates work?
With the converted lat/long coordinates then I could draw a circle on the current position on the map. Now when the coordinates change the circle is moving like it should.
I am working on an app using android studio where cell data is saved in a database with it's corresponding location in latitude and longitude coordinates and users can access this data when there is no service to find a way to a good to better service. The data will be drawn to a google maps activity and color coordinated to represent the color but I also want to add an arrow the points from current location to the best cell service within a radius that I will set up.
Is it possible to draw an arrow to accomplish the task of pointing to a data point that is drawn? any info that points me in the right direction or the answer will help, thank you.
EDIT
The arrow design I have in mind points to the better signal but does not connect to the other location. I will figure out a more complex pointing device later in development so I am just looking for information on the possibility of a short pointer arrow that represents a "GO THAT WAY" response.
You can use Ground overlays , where you can set particular image at given latlong.
LatLng NEWARK = new LatLng(40.714086, -74.228697);
GroundOverlayOptions newarkMap = new GroundOverlayOptions()
.image(BitmapDescriptorFactory.fromResource(R.drawable.newark_nj_1922))
.position(NEWARK, 8600f, 6500f);
map.addGroundOverlay(newarkMap);
for rotating the image you can look
https://stackoverflow.com/a/4332278/7386743
Are you talking about creating line between the two points ? Could you clearify more what do you exactly need ?
If it creating a line then you can use polyline
GoogleMap map;
Polyline line = map.addPolyline(new PolylineOptions()
.add(new LatLng(51.5, -0.1), new LatLng(40.7, -74.0))
.width(5)
.color(Color.RED));
This is how I'm currently using my google map;
mapFragment = ((SupportMapFragment) getChildFragmentManager()
.findFragmentById(R.id.map)).getMap();
mapFragment.setMyLocationEnabled(true);
mapFragment.setMapType(GoogleMap.MAP_TYPE_HYBRID);
mapFragment.getUiSettings().setMapToolbarEnabled(false);
mapFragment.getUiSettings().setScrollGesturesEnabled(false);
mapFragment.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null);
It produces a full screen map which for some reason is completely zoomed into the ocean so the map is just one big, blue pixel until you keep zooming out.
What I want to do:
When this activity gets opened, the map should have the user's location in the center, and the map should be as zoomed out as possible (as if you are lookin at a 2D globe)
The map should then zoom/animate into the player's location to give the same effect as when you press the location button on the top right of the map.
I have looked online, tried a few things and haven't had any luck with this. If anybody can walk me through this or give me a link to a nice guide it would be highly appreciated!
To achieve what you want, you should:
1) get the user's position, you can use the last known position so that your main activity would not hang and wait for the GPS return a location.
LocationManager locationManager = (LocationManager)getSystemService
(Context.LOCATION_SERVICE);
Location getLastLocation = locationManager.getLastKnownLocation
(LocationManager.PASSIVE_PROVIDER);
2) set the zoom level to 1, which is the smallest zoom level, the 2D globe; also you can center the map using the user location too.
googleMap.moveCamera(CameraUpdateFactory.zoomTo(1));
3) animate the camera to zoom into the user location with a zoom level 20 (the largest zoom level). One thing to notice is that, you might want to wait until the 2D globe maps is loaded so that user can see the zoom happens.
googleMap.setOnMapLoadedCallback(new GoogleMap.OnMapLoadedCallback() {
public void onMapLoaded() {
googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(new CameraPosition.Builder()
.target(new LatLng(userLocation.getLatitude(), userLocation.getLongitude()))
.zoom(20)
.build()));
}
});
I tried that and it works fine for me. Let me know if it is unclear, and hope it helps.
I have a mapview that displays your route traveled in a car, and has a seekbar that allows you to move along the path, displaying a map marker at each location with the speed on it. These map markers (Bitmaps) are generated at run-time since the speeds need to be placed on them. The problem I am having is that a trip may have hundreds of locations that require a new map marker/ Bitmap to be generated. I am currently creating a new bitmap for each location in an AsyncTask. For a long trip, the app force closes due to an OutOfMemoryError. I need a way to swap out the text on the map markers so that I can create 1 Bitmap.
Any help/advice is greatly appreciated.
Bipmaps are always a expensive operation when it comes to mobile development. What I would suggest you is to have a lazy loading of marker (Bitmaps). So, what you can do is first know the visible area and the bounds corresponding to that and fetch markers only when the map is scrolled in that region. This wont consume a lot of your memory at run-time and would fetch bitmaps only when needed.
Here is a sample code:
GoogleMap = theMap;
LatLngBounds bounds = this.theMap.getProjection().getVisibleRegion().latLngBounds;
LatLng placeLL = new LatLng(yourLatitude, yourLangtitude);
if (bounds.contains(placeLL)) {
//Do what you wanted to do with the markers inside the visible area
}
Hope this Helps!!