JAVA Google Maps API : set boundaries depending on zoom value - java

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.

Related

Center Google route on screen

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.

Can one detect when a JFreeChart ChartPanel has changed its zoom?

In a JFreeChart application, is it possible for the application to detect when its ChartPanel object has changed its zoom state, i.e., it has either been zoomed in or zoomed out? Is it possible to install a listener that will detect such a zoom state change?
For the record, I'm using the JFreeChart-FSE ("future state edition") library, so if there is no way to do this in the regular library, can it be done in FSE?
You could try to add a listener to the Plot of your ChartPanel.
The plot has the method addChangeListener().
So, when your plot is loaded, your compute the original zoom state.
You could associate the zoom state to visible data in your plot.
For example, the zoom state on domain Axis could be computed from the actual lowerBound and upperBound values like that :
double lowerBound = yourChartPanel.getXYPlot().getDomainAxis().getLowerBound();
double upperBound = yourChartPanel.getXYPlot().getDomainAxis().getUpperBound();
When your listener is called, you just have to check if the zoom state has changed since the last time.

Android - How can I achieve this Google Maps animation?

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.

Generating Bitmaps with custom text for map markers - OutOfMemoryError

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!!

Object relative to the image while zooming in or out

I have a map that is being drawn on the screen inside a VisualizationView. I am able to zoom in and out on this map, depending on where I focused inside this view using the touch functionality.
I also toggle between zooming in and drawing on this map. When I draw an arrow on the map and switch back to zooming in. I want the arrow I drawed on the map to stay at the same spot relative to the map I am zooming in and out on. Meaning the x and y pos of this arrow have to be adjusted.
I have all the variables needed I just dont know how to solve this since its math related.
Can someone explain to me how I can solve this math wise. I tried looking on the internet but I could not find a good explanation. Also the map resolution on the Tablet is always 576 x 576.
public void onZoom(final double focusX, final double focusY,
final double factor) {
//pseudocode
Triangle.x = ..
Triangle.y = ..
Triangle.repaint();
//peusocode
}
The code for the zooming is as following straight from the Library.
public void zoom(double focusX, double focusY, double factor) {
synchronized (mutex) {
Transform focus = Transform.translation(toMetricCoordinates((int) focusX, (int) focusY));
double zoom = RosMath.clamp(getZoom() * factor, MINIMUM_ZOOM, MAXIMUM_ZOOM) / getZoom();
transform = transform.multiply(focus).scale(zoom).multiply(focus.invert());
}
}
I hope someone can explain the math behind solving this.
I'm not directly familiar with the library you're using, but to move the location of the arrow (triangle) to its new location you should apply the same transform to it as you do to the map.
Think of it this way: Before zooming, the location of the arrow (the center or head of the arrow, however you define "location") and the point on the map it's pointing to have the same coordinates. After zooming, the point on the map will have moved to a new location and you want the arrow to move to that same new location, thus you need to use the same transform. Like I said, I'm not familiar with the library you're using so I can't tell you exactly how to do that, but that's where you want to be.
Note, however, that you only want to transform one point of the arrow/triangle and draw the other points relative to it. If you transform all 3 you'll end up with the arrow getting larger and smaller as you zoom in and out (which I assume you don't want).

Categories

Resources