Skip to content
This repository was archived by the owner on Aug 8, 2023. It is now read-only.
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,13 @@
public abstract class MultiPoint extends Annotation {

private List<LatLng> points;
private List<List<LatLng>> holes;
private float alpha = 1.0f;

protected MultiPoint() {
super();
points = new ArrayList<>();
holes = new ArrayList<>();
}

/**
Expand All @@ -27,6 +29,14 @@ public List<LatLng> getPoints() {
return new ArrayList<>(points);
}

/*
* Returns a copy of the holes.
* @return holes - as a copy
*/
public List<List<LatLng>> getHoles() {
return new ArrayList<>(holes);
}

/**
* Sets the points of this polyline. This method will take a copy
* of the points, so further mutations to points will have no effect
Expand All @@ -42,6 +52,10 @@ void addPoint(LatLng point) {
points.add(point);
}

void addHole(List<LatLng> hole) {
holes.add(hole);
}

public float getAlpha() {
return alpha;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,17 @@ public PolygonOptions addAll(Iterable<LatLng> points) {
return this;
}

public PolygonOptions addHole(Iterable<LatLng> points) {
List<LatLng> hole = new ArrayList<LatLng>();
for (LatLng point : points) {
hole.add(point);
}

polygon.addHole(hole);

return this;
}

public PolygonOptions alpha(float alpha) {
polygon.setAlpha(alpha);
return this;
Expand Down Expand Up @@ -126,6 +137,10 @@ public List<LatLng> getPoints() {
return polygon.getPoints();
}

public List<List<LatLng>> getHoles() {
return polygon.getHoles();
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
Expand All @@ -136,6 +151,7 @@ public boolean equals(Object o) {
if (Float.compare(polygon.getAlpha(), getAlpha()) != 0) return false;
if (getFillColor() != polygon.getFillColor()) return false;
if (getStrokeColor() != polygon.getStrokeColor()) return false;
if (getHoles() != null ? !getHoles().equals(polygon.getHoles()) : polygon.getHoles() != null) return false;
return !(getPoints() != null ? !getPoints().equals(polygon.getPoints()) : polygon.getPoints() != null);
}

Expand All @@ -146,6 +162,7 @@ public int hashCode() {
result = 31 * result + getFillColor();
result = 31 * result + getStrokeColor();
result = 31 * result + (getPoints() != null ? getPoints().hashCode() : 0);
result = 31 * result + (getHoles() != null ? getHoles().hashCode() : 0);
return result;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,52 @@ public void onMapReady(MapboxMap mapboxMap) {
polygon.add(new LatLng(45.515369, -122.678489));
polygon.add(new LatLng(45.506346, -122.702007));
polygon.add(new LatLng(45.522585, -122.685699));

double lat = 0;
double lon = 0;
int points = 0;
for (LatLng latLng : polygon) {
points++;
lat += latLng.getLatitude();
lon += latLng.getLongitude();
}

lat = lat / points;
lon = lon / points;

List<LatLng> hole1 = new ArrayList<>();
hole1.add(new LatLng(lat, lon));
hole1.add(new LatLng(lat + 0.01, lon));
hole1.add(new LatLng(lat + 0.01, lon + 0.01));
hole1.add(new LatLng(lat, lon + 0.01));
hole1.add(new LatLng(lat, lon));

lat = lat - 0.001;
lon = lon - 0.001;

List<LatLng> hole2 = new ArrayList<>();
hole2.add(new LatLng(lat, lon));
hole2.add(new LatLng(lat - 0.005, lon));
hole2.add(new LatLng(lat - 0.005, lon - 0.005));
hole2.add(new LatLng(lat, lon - 0.005));
hole2.add(new LatLng(lat, lon));

lat = lat + 0.008;
lon = lon - 0.01;

List<LatLng> hole3 = new ArrayList<>();
hole3.add(new LatLng(lat, lon));
hole3.add(new LatLng(lat - 0.005, lon));
hole3.add(new LatLng(lat - 0.005, lon - 0.005));
hole3.add(new LatLng(lat, lon - 0.005));
hole3.add(new LatLng(lat, lon));

mapboxMap.addPolygon(new PolygonOptions()
.addAll(polygon)
.addHole(hole1)
.addHole(hole2)
.addHole(hole3)
.alpha(0.5f)
.fillColor(Color.parseColor("#3bb2d0")));
}
});
Expand Down
68 changes: 62 additions & 6 deletions platform/android/src/jni.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ jni::jfieldID* polygonAlphaId = nullptr;
jni::jfieldID* polygonFillColorId = nullptr;
jni::jfieldID* polygonStrokeColorId = nullptr;
jni::jfieldID* polygonPointsId = nullptr;
jni::jfieldID* polygonHolesId = nullptr;

jni::jmethodID* listToArrayId = nullptr;

Expand Down Expand Up @@ -248,6 +249,52 @@ jni::jarray<jlong>* std_vector_uint_to_jobject(JNIEnv *env, std::vector<uint32_t
return &jarray;
}

mbgl::AnnotationSegments annotation_segments_from_jlist_of_latlng_jlist(JNIEnv *env, jni::jobject* jlist) {

mbgl::AnnotationSegments segments;

NullCheck(*env, jlist);

jni::jarray<jni::jobject>* jarray =
reinterpret_cast<jni::jarray<jni::jobject>*>(jni::CallMethod<jni::jobject*>(*env, jlist, *listToArrayId));

NullCheck(*env, jarray);
std::size_t len = jni::GetArrayLength(*env, *jarray);

for (std::size_t i = 0; i < len; i++) {
mbgl::AnnotationSegment segment;

jni::jobject* latLngList = reinterpret_cast<jni::jobject*>(jni::GetObjectArrayElement(*env, *jarray, i));
NullCheck(*env, latLngList);

jni::jarray<jni::jobject>* holePoints =
reinterpret_cast<jni::jarray<jni::jobject>*>(jni::CallMethod<jni::jobject*>(*env, latLngList, *listToArrayId));
NullCheck(*env, holePoints);

std::size_t holePointsLen = jni::GetArrayLength(*env, *holePoints);

for (std::size_t j = 0; j < holePointsLen; j++) {
jni::jobject* latLng = reinterpret_cast<jni::jobject*>(jni::GetObjectArrayElement(*env, *holePoints, j));
NullCheck(*env, latLng);

jdouble latitude = jni::GetField<jdouble>(*env, latLng, *latLngLatitudeId);
jdouble longitude = jni::GetField<jdouble>(*env, latLng, *latLngLongitudeId);

segment.push_back(mbgl::LatLng(latitude, longitude));
jni::DeleteLocalRef(*env, latLng);
}

jni::DeleteLocalRef(*env, holePoints);

segments.push_back(segment);
}

jni::DeleteLocalRef(*env, jarray);
jarray = nullptr;

return segments;
}

mbgl::AnnotationSegment annotation_segment_from_latlng_jlist(JNIEnv *env, jni::jobject* jlist) {
mbgl::AnnotationSegment segment;

Expand Down Expand Up @@ -277,7 +324,7 @@ mbgl::AnnotationSegment annotation_segment_from_latlng_jlist(JNIEnv *env, jni::j
return segment;
}

std::pair<mbgl::AnnotationSegment, mbgl::ShapeAnnotation::Properties> annotation_std_pair_from_polygon_jobject(JNIEnv *env, jni::jobject* polygon) {
std::pair<mbgl::AnnotationSegments, mbgl::ShapeAnnotation::Properties> annotation_std_pair_from_polygon_jobject(JNIEnv *env, jni::jobject* polygon) {
jfloat alpha = jni::GetField<jfloat>(*env, polygon, *polygonAlphaId);
jint fillColor = jni::GetField<jint>(*env, polygon, *polygonFillColorId);
jint strokeColor = jni::GetField<jint>(*env, polygon, *polygonStrokeColorId);
Expand All @@ -303,7 +350,14 @@ std::pair<mbgl::AnnotationSegment, mbgl::ShapeAnnotation::Properties> annotation
mbgl::AnnotationSegment segment = annotation_segment_from_latlng_jlist(env, points);
jni::DeleteLocalRef(*env, points);

return std::make_pair(segment, shapeProperties);
jni::jobject* holes = jni::GetField<jni::jobject*>(*env, polygon, *polygonHolesId);
mbgl::AnnotationSegments segments = annotation_segments_from_jlist_of_latlng_jlist(env, holes);
jni::DeleteLocalRef(*env, holes);

// Insert the shell segment at the beginning of the list
segments.insert(segments.begin(), segment);

return std::make_pair(segments, shapeProperties);
}

static std::vector<uint8_t> metadata_from_java(JNIEnv* env, jni::jarray<jbyte>& j) {
Expand Down Expand Up @@ -892,11 +946,12 @@ jlong nativeAddPolygon(JNIEnv *env, jni::jobject* obj, jlong nativeMapViewPtr, j
NativeMapView *nativeMapView = reinterpret_cast<NativeMapView *>(nativeMapViewPtr);

std::vector<mbgl::ShapeAnnotation> shapes;
std::pair<mbgl::AnnotationSegment, mbgl::ShapeAnnotation::Properties> segment = annotation_std_pair_from_polygon_jobject(env, polygon);
std::pair<mbgl::AnnotationSegments, mbgl::ShapeAnnotation::Properties> segment = annotation_std_pair_from_polygon_jobject(env, polygon);

shapes.emplace_back(mbgl::AnnotationSegments { segment.first }, segment.second);
shapes.emplace_back(segment.first, segment.second);

std::vector<uint32_t> shapeAnnotationIDs = nativeMapView->getMap().addShapeAnnotations(shapes);

uint32_t id = shapeAnnotationIDs.at(0);
return id;
}
Expand All @@ -918,8 +973,8 @@ jni::jarray<jlong>* nativeAddPolygons(JNIEnv *env, jni::jobject* obj, jlong nati
for (std::size_t i = 0; i < len; i++) {
jni::jobject* polygon = jni::GetObjectArrayElement(*env, *jarray, i);

std::pair<mbgl::AnnotationSegment, mbgl::ShapeAnnotation::Properties> segment = annotation_std_pair_from_polygon_jobject(env, polygon);
shapes.emplace_back(mbgl::AnnotationSegments { segment.first }, segment.second);
std::pair<mbgl::AnnotationSegments, mbgl::ShapeAnnotation::Properties> segment = annotation_std_pair_from_polygon_jobject(env, polygon);
shapes.emplace_back(segment.first, segment.second);

jni::DeleteLocalRef(*env, polygon);
}
Expand Down Expand Up @@ -1755,6 +1810,7 @@ extern "C" JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) {
polygonFillColorId = &jni::GetFieldID(env, *polygonClass, "fillColor", "I");
polygonStrokeColorId = &jni::GetFieldID(env, *polygonClass, "strokeColor", "I");
polygonPointsId = &jni::GetFieldID(env, *polygonClass, "points", "Ljava/util/List;");
polygonHolesId = &jni::GetFieldID(env, *polygonClass, "holes", "Ljava/util.List;");

jni::jclass* listClass = &jni::FindClass(env, "java/util/List");
listToArrayId = &jni::GetMethodID(env, *listClass, "toArray", "()[Ljava/lang/Object;");
Expand Down