I do this in my java class:
//this is in On Create
GameMapFragment map = new GameMapFragment();
onMapReady(map.googleMap);
...
public void onMapReady(GoogleMap map) {
map.moveCamera(CameraUpdateFactory.newLatLngZoom(
new LatLng(-18.142, 178.431), 2));
// Polylines are useful for marking paths and routes on the map.
map.addPolyline(new PolylineOptions().geodesic(true)
.add(new LatLng(-33.866, 151.195)) // Sydney
.add(new LatLng(-18.142, 178.431)) // Fiji
.add(new LatLng(21.291, -157.821)) // Hawaii
.add(new LatLng(37.423, -122.091)) // Mountain View
);
}
Yet all that shows up is my map without any points - not even a PolyLine. How do I make the polygon visible?
It looks like you should be calling map.getMapAsync(this); instead of onMapReady(map.googleMap); in onCreate (assuming your Activity implements OnMapReadyCallback).
Related
I have about 200 Polylines on my Map.
Now i try to find out witch Polyline the User have Click.
But polyline.getId() give me every Time a new random number like PL65 next start of the App PL144 and so on.
Is there any Way to know witch Polyline the user have click ?
I must show for every Polyline a Text with rules.
PolylineOptions spss7 = new PolylineOptions()
.add(new LatLng(52.260803, 8.16152))
.add(new LatLng(52.259113, 8.162186))
.add(new LatLng(52.258438, 8.158634))
.color(Color.GREEN)
.geodesic(true);
Polyline psps7 = googleMap.addPolyline(spss7);
psps7.setClickable(true);
PolylineOptions spss8 = new PolylineOptions()
.add(new LatLng(52.3524987, 7.709607499999999))
.add(new LatLng(52.3524921, 7.7098328))
.add(new LatLng(52.3534915, 7.710031300000001))
.color(Color.GREEN)
.geodesic(true);
Polyline psps8 = googleMap.addPolyline(spss8);
psps8.setClickable(true);
}
googleMap.setOnPolylineClickListener(new GoogleMap.OnPolylineClickListener(){
public void onPolylineClick(Polyline polyline) {
int strokeColor = polyline.getColor() ^ 0x0000CC00;
polyline.setColor(strokeColor);
Toast.makeText(getActivity(), "Polyline klick: "+polyline.getId(), Toast.LENGTH_LONG).show();
}
You can use the polyline tag to identify the polyline.
PolylineOptions spss7 = new PolylineOptions()
.add(new LatLng(52.260803, 8.16152))
.add(new LatLng(52.259113, 8.162186))
.add(new LatLng(52.258438, 8.158634))
.color(Color.GREEN)
.geodesic(true);
Polyline psps7 = googleMap.addPolyline(spss7);
psps7.setClickable(true);
psps7.setTag(new String("psps7"));
PolylineOptions spss8 = new PolylineOptions()
.add(new LatLng(52.3524987, 7.709607499999999))
.add(new LatLng(52.3524921, 7.7098328))
.add(new LatLng(52.3534915, 7.710031300000001))
.color(Color.GREEN)
.geodesic(true);
Polyline psps8 = googleMap.addPolyline(spss8);
psps8.setClickable(true);
psps8.setTag(new String("psps8"));
}
googleMap.setOnPolylineClickListener(new GoogleMap.OnPolylineClickListener(){
public void onPolylineClick(Polyline polyline) {
int strokeColor = polyline.getColor() ^ 0x0000CC00;
polyline.setColor(strokeColor);
Toast.makeText(getActivity(), "Polyline klick: " +
(String)polyline.getTag(), Toast.LENGTH_LONG).show();
}
We set the tag for the 2 polylines in this example then in the onClickListener we get the tag and cast it back to a string.
I'm developing an android app in which I need to show the Google Map with the path drawn from source to destination.For Example I need to go from A to B there might be different routes but I need to draw only on a particular route.
This is what tried but it was not taking on any road it directly displaying a line from source to destination.
public class MapsActivity extends Activity {
private GoogleMap googleMap;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
try {
if (googleMap == null) {
googleMap = ((MapFragment) getFragmentManager().
findFragmentById(R.id.map)).getMap();
}
/* googleMap.setMapType(GoogleMap.MAP_TYPE_TERRAIN);
Marker TP = googleMap.addMarker(new MarkerOptions().
position(TutorialsPoint).title("My Location"));*/
Polyline line = googleMap.addPolyline(new PolylineOptions()
.add(new LatLng(17.4489224, 78.3483612), new LatLng(17.4831854, 77.9736794))
.width(5)
.color(Color.RED));
}
catch (Exception e) {
e.printStackTrace();
}
}
First you have to create a Polyline object to specify the points, then you can set the Polyline object adding the Polyline options:
PolylineOptions polylineOptions = new PolylineOptions()
.add(new LatLng(37.35, -122.0)); // Point A.
.add(new LatLng(38.35, -123.0)); // Point B.
Polyline polyline = mMap.addPolyline(polylineOptions);
To alter the shape of the polyline after it has been added, you can call Polyline.setPoints() and provide a new list of points for the polyline.
I have searched in google and find this answer where i can remove all polyLine of a Map.
But I want to remove only a particular line from the poly Line. For Example I want to remove the line from 2nd to 3rd LatLng in the given code. I want to change color of a particular line of a polyLine or make it transparent. And I also want to add a clickListener to PolyLine
PolylineOptions rectOptions = new PolylineOptions()
.add(new LatLng(37.35, -122.0))
.add(new LatLng(37.45, -122.0)) // North of the previous point, but at the same longitude
.add(new LatLng(37.45, -122.2)) // Same latitude, and 30km to the west
.add(new LatLng(37.35, -122.2)) // Same longitude, and 16km to the south
.add(new LatLng(37.35, -122.0)).width(5).color(Color.RED);; // Closes the polyline.
Polyline polyline = myMap.addPolyline(rectOptions);
Main goal is to remove/make it transparent a particular line of a PolyLine on click or tap.
PolylineOptions line= new PolylineOptions().add(HAMBURG,// these are latlong
KIEL,
KIEL2,
KIEL3
new LatLng(40.748963847316034,
-73.96807193756104)
)
.width(5).color(Color.RED);
Polyline polyline= googleMap.addPolyline(line);
And i want to remov line between KIEL1 and KIEL2
You'll have to manually remove points from the polyline.
EDIT:
Step by step:
Create a List of polylines:
List<Polyline> mPolylines = new ArrayList<Polyline>();
Add PolylineOptions to the map:
Polyline polyline1 = myMap.addPolyline(rectOptions1);
Polyline polyline2 = myMap.addPolyline(rectOptions2);
Polyline polyline3 = myMap.addPolyline(rectOptions3);
Then save the added polylines to your array
mPolylines.add(polyline1);
mPolylines.add(polyline2);
mPolylines.add(polyline3);
Now at any time you can trim the polyline like so:
// Get polyline1
List<LatLng> points = mPolylines.get(0).getPoints();
// Set the bounds of points to remove (inclusive)
int startPoint = 1, endPoint = 2; // will remove kiel1 and kiel2
// Remove the points
for (int i=startPoint; i<=endPoint; i++) {
points.remove(i);
}
// Added this line as getPoints returns a copy
mPolylines.get(0).setPoints(points);
Now in theory this should work fine. I found that the points don't actually change after setPoints.
I even tried:
Polyline polyline = mPolylines.get(0);
// Get copy of the points
List<LatLng> points = polyline.getPoints();
mPolylines.get(0).remove();
mPolylines.remove(0);
for (int i=3000; i<7000; i++) {
points.remove(i);
}
// Create a PolylineOptions object with the new points
PolylineOptions polylineOptions = new PolylineOptions().addAll(points);
mPolylines.add(0, mMap.addPolyline(polylineOptions));
And to my surprise a new Polyline was added (I can tell by the changed stroke width and color), but it still used the old points, even though points.size() returned the correct (trimmed) count.
I'm not sure why this is so, perhaps some error in my code. You can try these methods yourself and see if you are any luckier.
I'm new to the google maps v2, I need to draw a rectangle from point1 to point2, with a custom color and width, I tried to use a Polyline, but all the labels (city name, country name ..) are still visible, so how can I do this ?
thank you
this is what I tried
mMapView.addPolyline(new PolylineOptions()
.add(new LatLng(xx,xx), new LatLng(xx,xx))
.width(50)
.color(Color.parseColor("#f4f3f0")));
Just read the Documentation
Example
GoogleMap map;
// ... get a map.
// Add a thin red line from London to New York.
Polyline line = map.addPolyline(new PolylineOptions()
.add(new LatLng(51.5, -0.1), new LatLng(40.7, -74.0))
.width(5)
.color(Color.RED));
Use
public class My_Map extends Activity {
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.map_activity);
GoogleMap map = ((MapFragment) getFragmentManager()
.findFragmentById(R.id.map)).getMap();
map.moveCamera(CameraUpdateFactory.newLatLngZoom(
new LatLng(-18.142, 178.431), 2));
// Polylines are useful for marking paths and routes on the map.
map.addPolyline(new PolylineOptions().geodesic(true)
.add(new LatLng(-33.866, 151.195))
.add(new LatLng(-18.142, 178.431))
.add(new LatLng(21.291, -157.821))
.add(new LatLng(37.423, -122.091))
);
}
}
For more details just check How to draw free hand polygon in Google map V2 in Android?
In Google Maps v2 for Android, how can I get the visible markers? I know I can use Projection and eliminate points < 0 and points > screen size. But I do not wish to check one by one, it can be too slow if I have a lot of markers. Is there any easy way? Or some off-the-shelf solution? If yes, which one?
Ok, the following is the code the I have used before to determine what the user can see and then only draw the markers that are visible.
I think you might be able to adapt it to your purpose.
get the current rectangle "viewport" of the map (note:must be run on the main thread)
this.mLatLngBounds = this.mMap.getProjection().getVisibleRegion().latLngBounds;
sort the 2 points (top-left and bottom-right) so that we can use min/max logic
double lowLat;
double lowLng;
double highLat;
double highLng;
if (this.mLatLngBounds.northeast.latitude < this.mLatLngBounds.southwest.latitude)
{
lowLat = this.mLatLngBounds.northeast.latitude;
highLat = this.mLatLngBounds.southwest.latitude;
}
else
{
highLat = this.mLatLngBounds.northeast.latitude;
lowLat = this.mLatLngBounds.southwest.latitude;
}
if (this.mLatLngBounds.northeast.longitude < this.mLatLngBounds.southwest.longitude)
{
lowLng = this.mLatLngBounds.northeast.longitude;
highLng = this.mLatLngBounds.southwest.longitude;
}
else
{
highLng = this.mLatLngBounds.northeast.longitude;
lowLng = this.mLatLngBounds.southwest.longitude;
}
then in my case I had this data in a db, so i could use >= and <= to extract only the pins i wanted
You could use the android-map-extension library. Amongst others it offers a List GoogleMap.getDisplayedMarkers() method.
You could add this Extension Function to GoogleMap class if you are using Kotlin
fun GoogleMap.isMarkerVisible(markerPosition: LatLng) =
projection.visibleRegion.latLngBounds.contains(markerPosition)
You just pass the marker position as a parameter of this method and do whatever you want with the result.
If you are using Java you can just declare the function wherever fits better for you.
Hope it helps!
You are looking for either markers:
https://developers.google.com/maps/documentation/android/marker
private GoogleMap mMap;
mMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
mMap.addMarker(new MarkerOptions()
.position(new LatLng(0, 0))
.title("Hello world"));
Or direct drawing:
https://developers.google.com/maps/documentation/android/shapes
// Instantiates a new Polyline object and adds points to define a rectangle
PolylineOptions rectOptions = new PolylineOptions()
.add(new LatLng(37.35, -122.0))
.add(new LatLng(37.45, -122.0)) // North of the previous point, but at the same longitude
.add(new LatLng(37.45, -122.2)) // Same latitude, and 30km to the west
.add(new LatLng(37.35, -122.2)) // Same longitude, and 16km to the south
.add(new LatLng(37.35, -122.0)); // Closes the polyline.
// Get back the mutable Polyline
Polyline polyline = myMap.addPolyline(rectOptions);