All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.mapbox.geojson.MultiPoint Maven / Gradle / Ivy

There is a newer version: 5.9.0-alpha.1
Show newest version
package com.mapbox.geojson;

import androidx.annotation.Keep;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
import com.mapbox.geojson.gson.GeoJsonAdapterFactory;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * A MultiPoint represents two or more geographic points that share a relationship and is one of the
 * seven geometries found in the GeoJson spec. 

This adheres to the RFC 7946 internet standard * when serialized into JSON. When deserialized, this class becomes an immutable object which should * be initiated using its static factory methods. The list of points must be equal to or greater * than 2.

A sample GeoJson MultiPoint's provided below (in it's serialized state). *

 * {
 *   "TYPE": "MultiPoint",
 *   "coordinates": [
 *     [100.0, 0.0],
 *     [101.0, 1.0]
 *   ]
 * }
 * 
* Look over the {@link Point} documentation to get more * information about formatting your list of point objects correctly. * * @since 1.0.0 */ @Keep public final class MultiPoint implements CoordinateContainer> { private static final String TYPE = "MultiPoint"; private final String type; private final BoundingBox bbox; private final List coordinates; /** * Create a new instance of this class by passing in a formatted valid JSON String. If you are * creating a MultiPoint object from scratch it is better to use one of the other provided static * factory methods such as {@link #fromLngLats(List)}. For a valid MultiPoint to exist, it must * have at least 2 coordinate entries. * * @param json a formatted valid JSON string defining a GeoJson MultiPoint * @return a new instance of this class defined by the values passed inside this static factory * method * @since 1.0.0 */ public static MultiPoint fromJson(@NonNull String json) { GsonBuilder gson = new GsonBuilder(); gson.registerTypeAdapterFactory(GeoJsonAdapterFactory.create()); return gson.create().fromJson(json, MultiPoint.class); } /** * Create a new instance of this class by defining a list of {@link Point}s which follow the * correct specifications described in the Point documentation. Note that there should not be any * duplicate points inside the list.

Note that if less than 2 points are passed in, a runtime * exception will occur.

* * @param points a list of {@link Point}s which make up the LineString geometry * @return a new instance of this class defined by the values passed inside this static factory * method * @since 3.0.0 */ public static MultiPoint fromLngLats(@NonNull List points) { return new MultiPoint(TYPE, null, points); } /** * Create a new instance of this class by defining a list of {@link Point}s which follow the * correct specifications described in the Point documentation. Note that there should not be any * duplicate points inside the list.

Note that if less than 2 points are passed in, a runtime * exception will occur.

* * @param points a list of {@link Point}s which make up the LineString geometry * @param bbox optionally include a bbox definition as a double array * @return a new instance of this class defined by the values passed inside this static factory * method * @since 3.0.0 */ public static MultiPoint fromLngLats(@NonNull List points, @Nullable BoundingBox bbox) { return new MultiPoint(TYPE, bbox, points); } static MultiPoint fromLngLats(@NonNull double[][] coordinates) { ArrayList converted = new ArrayList<>(coordinates.length); for (int i = 0; i < coordinates.length; i++) { converted.add(Point.fromLngLat(coordinates[i])); } return new MultiPoint(TYPE, null, converted); } MultiPoint(String type, @Nullable BoundingBox bbox, List coordinates) { if (type == null) { throw new NullPointerException("Null type"); } this.type = type; this.bbox = bbox; if (coordinates == null) { throw new NullPointerException("Null coordinates"); } this.coordinates = coordinates; } /** * This describes the TYPE of GeoJson this object is, thus this will always return {@link * MultiPoint}. * * @return a String which describes the TYPE of geometry, for this object it will always return * {@code MultiPoint} * @since 1.0.0 */ @NonNull @Override public String type() { return type; } /** * A Feature Collection might have a member named {@code bbox} to include information on the * coordinate range for it's {@link Feature}s. The value of the bbox member MUST be a list of size * 2*n where n is the number of dimensions represented in the contained feature geometries, with * all axes of the most southwesterly point followed by all axes of the more northeasterly point. * The axes order of a bbox follows the axes order of geometries. * * @return a list of double coordinate values describing a bounding box * @since 3.0.0 */ @Nullable @Override public BoundingBox bbox() { return bbox; } /** * provides the list of {@link Point}s that make up the MultiPoint geometry. * * @return a list of points * @since 3.0.0 */ @NonNull @Override public List coordinates() { return coordinates; } /** * This takes the currently defined values found inside this instance and converts it to a GeoJson * string. * * @return a JSON string which represents this MultiPoint geometry * @since 1.0.0 */ @Override public String toJson() { GsonBuilder gson = new GsonBuilder(); gson.registerTypeAdapterFactory(GeoJsonAdapterFactory.create()); return gson.create().toJson(this); } /** * Gson TYPE adapter for parsing Gson to this class. * * @param gson the built {@link Gson} object * @return the TYPE adapter for this class * @since 3.0.0 */ public static TypeAdapter typeAdapter(Gson gson) { return new MultiPoint.GsonTypeAdapter(gson); } @Override public String toString() { return "MultiPoint{" + "type=" + type + ", " + "bbox=" + bbox + ", " + "coordinates=" + coordinates + "}"; } @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (obj instanceof MultiPoint) { MultiPoint that = (MultiPoint) obj; return (this.type.equals(that.type())) && ((this.bbox == null) ? (that.bbox() == null) : this.bbox.equals(that.bbox())) && (this.coordinates.equals(that.coordinates())); } return false; } @Override public int hashCode() { int hashCode = 1; hashCode *= 1000003; hashCode ^= type.hashCode(); hashCode *= 1000003; hashCode ^= (bbox == null) ? 0 : bbox.hashCode(); hashCode *= 1000003; hashCode ^= coordinates.hashCode(); return hashCode; } /** * TypeAdapter for MultiPoint geometry. * * @since 4.6.0 */ static final class GsonTypeAdapter extends BaseGeometryTypeAdapter> { GsonTypeAdapter(Gson gson) { super(gson, new ListOfPointCoordinatesTypeAdapter()); } @Override public void write(JsonWriter jsonWriter, MultiPoint object) throws IOException { writeCoordinateContainer(jsonWriter, object); } @Override public MultiPoint read(JsonReader jsonReader) throws IOException { return (MultiPoint) readCoordinateContainer(jsonReader); } @Override CoordinateContainer> createCoordinateContainer(String type, BoundingBox bbox, List coordinates) { return new MultiPoint(type == null ? "MultiPoint" : type, bbox, coordinates); } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy