google-maps-services-java icon indicating copy to clipboard operation
google-maps-services-java copied to clipboard

[Google Static Maps] Handle styled Maps with the "style" parameter

Open Kobee1203 opened this issue 3 years ago • 5 comments

I use the Google Static Maps API and I would like to customize the presentation of the Map by applying my own styles.

I found this documentation: https://developers.google.com/maps/documentation/maps-static/styling

Is your feature request related to a problem? Please describe.

But I can't find a method in StaticMapsRequest.java to add styles.

As an alternative, I used StaticMapsRequest.custom(...) method.

req.custom("style", "feature:poi|visibility:off");

But I can't add multiple styles, because the custom method allows to add just one 'style' parameter.

I can't do the following:

StaticMapsRequest req = StaticMapsApi.newRequest(sc.context, new Size(WIDTH, HEIGHT));
req.center("Google Sydney");
req.zoom(16);

req.custom("style", "feature:poi|visibility:off");
req.custom("style", "feature:landscape|visibility:off");

ByteArrayInputStream bais = new ByteArrayInputStream(req.await().imageData);
BufferedImage img = ImageIO.read(bais); 

Describe the solution you'd like I would like to have a method to handle the 'style' parameter.

req.style(
    new Style()
        .feature(new StyleFeature().poi())
        .element(new StyleElement().labels().icon())
        .rules(new StyleRules().color(java.awt.Color.WHITE))
);
req.style(
    new Style()
        .feature(new StyleFeature().landscape().man_made())
        .rules(new StyleRules().visbility().off())
);

Describe alternatives you've considered The custom method allows to add a single string:

public A custom(String parameter, String value) {
    return this.param(parameter, value);
}

An alternative would be to add a new custom method that allows a list of Strings:

public A custom(String parameter, List<String> values) {
    values.forEach(v -> this.paramAddToList(parameter, v));
    return this.getInstance();
}

Kobee1203 avatar May 12 '22 15:05 Kobee1203

This issue has been automatically marked as stale because it has not had recent activity. Please comment here if it is still valid so that we can reprioritize. Thank you!

stale[bot] avatar Sep 21 '22 04:09 stale[bot]

...

Kobee1203 avatar Oct 06 '22 14:10 Kobee1203

This issue has been automatically marked as stale because it has not had recent activity. Please comment here if it is still valid so that we can reprioritize. Thank you!

stale[bot] avatar Jun 18 '23 10:06 stale[bot]

It is still valid.

BesitecMH avatar Mar 22 '24 12:03 BesitecMH

This is what I did as a minimum workaround:

public final class MyStaticMapsRequest extends StaticMapsRequest {
	/**
	 * Instantiates a new my static maps request.
	 *
	 * @param context the context
	 */
	private MyStaticMapsRequest(GeoApiContext context) {
		super(context);
	}

	/**
	 * Of.
	 *
	 * @param context the context
	 * @param size the size
	 * @return the my static maps request
	 */
	public static MyStaticMapsRequest of(GeoApiContext context, Size size) {
		MyStaticMapsRequest request = new MyStaticMapsRequest(context);
		request.size(size);
		return request;
	}

	@Override
	public MyStaticMapsRequest center(LatLng location) {
		return (MyStaticMapsRequest) super.center(location);
	}

	@Override
	public MyStaticMapsRequest center(String location) {
		return (MyStaticMapsRequest) super.center(location);
	}

	@Override
	public MyStaticMapsRequest format(ImageFormat format) {
		return (MyStaticMapsRequest) super.format(format);
	}

	@Override
	public MyStaticMapsRequest maptype(StaticMapType maptype) {
		return (MyStaticMapsRequest) super.maptype(maptype);
	}

	@Override
	public MyStaticMapsRequest markers(Markers markers) {
		return (MyStaticMapsRequest) super.markers(markers);
	}

	@Override
	public MyStaticMapsRequest path(EncodedPolyline path) {
		return (MyStaticMapsRequest) super.path(path);
	}

	@Override
	public MyStaticMapsRequest path(Path path) {
		return (MyStaticMapsRequest) super.path(path);
	}

	@Override
	public MyStaticMapsRequest region(String region) {
		return (MyStaticMapsRequest) super.region(region);
	}

	@Override
	public MyStaticMapsRequest scale(int scale) {
		return (MyStaticMapsRequest) super.scale(scale);
	}

	@Override
	public MyStaticMapsRequest size(Size size) {
		return (MyStaticMapsRequest) super.size(size);
	}

	@Override
	public MyStaticMapsRequest visible(LatLng visibleLocation) {
		return (MyStaticMapsRequest) super.visible(visibleLocation);
	}

	@Override
	public MyStaticMapsRequest visible(String visibleLocation) {
		return (MyStaticMapsRequest) super.visible(visibleLocation);
	}

	@Override
	public MyStaticMapsRequest zoom(int zoom) {
		return (MyStaticMapsRequest) super.zoom(zoom);
	}

	/**
	 * Style.
	 *
	 * @param value The value of the custom parameter.
	 * @return Returns the request for call chaining.
	 */
	public MyStaticMapsRequest style(String value) {
		return (MyStaticMapsRequest) paramAddToList("style", value);
	}

BesitecMH avatar Mar 22 '24 12:03 BesitecMH