Reputation: 789
I am trying to check if map centre is inside a polygon or not. My code for creating mulitple polygons on map is this:
for (int i = 0; i < Constant.arr_zone.size(); i++) {
LatLngBounds.Builder builder = new LatLngBounds.Builder();
ArrayList<LatLng> list = new ArrayList<>();
for (int j = 0; j < Constant.arr_zone.get(i).polygon.length; j++) {
list.add(new LatLng(Constant.arr_zone.get(i).polygon[j].geo_x,
Constant.arr_zone.get(i).polygon[j].geo_y));
builder.include(list.get(j));
}
polygonOptions = new PolygonOptions();
polygonOptions.addAll(list);
polygonOptions.strokeColor(R.color.theme_color);
polygonOptions.strokeWidth(2);
polygonOptions.fillColor(Color.parseColor("#33000040"));
Polygon polygon = mMap.addPolygon(polygonOptions);
ltbounds = builder.build();
arr_ltlngbounds.add(ltbounds);
}
Next I am checking if map center is inside any polygon or not
map.setOnCameraChangeListener(new OnCameraChangeListener() {
@Override
public void onCameraChange(CameraPosition cameraPosition) {
if (arr_ltlngbounds != null && arr_ltlngbounds.size() > 0) {
for (LatLngBounds l : arr_ltlngbounds) {
if (l.contains(mMap.getCameraPosition().target)) {
snackbar = Snackbar
.make(inflatedView, "Service available here", Snackbar.LENGTH_INDEFINITE)
.setAction("GET", new View.OnClickListener() {
@Override
public void onClick(View view) {
String arr[] = {user_location.latitude + "", user_location.longitude + "", "4"};
new Get_service(activity, A.this, get_service).execute(arr);
}
});
snackbar.show();
break;
}
}
}
}
});
This is my build.gradle just incase
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "22.0.1"
defaultConfig {
multiDexEnabled true
applicationId "com.aaa.bbb"
minSdkVersion 14
targetSdkVersion 23
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
}
dependencies {
compile project(':library')
compile 'com.android.support:appcompat-v7:23.1.0'
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:design:23.2.0'
compile 'com.android.support:recyclerview-v7:23.1.0'
compile 'com.newrelic.agent.android:android-agent:5.3.1'
compile 'com.github.bumptech.glide:glide:3.6.1'
compile 'com.android.support:cardview-v7:23.1.0'
compile 'com.github.jaydeepw:poly-picker:v1.0.22'
compile 'com.xgc1986.android:parallaxpagertransformer:1.0.3'
compile 'com.google.code.gson:gson:2.6.2'
compile 'me.dm7.barcodescanner:zxing:1.8.4'
compile 'com.github.castorflex.smoothprogressbar:library:1.0.0'
compile 'com.github.clans:fab:1.6.2'
compile 'com.google.android.gms:play-services:8.3.0'
compile 'com.google.maps.android:android-maps-utils:0.4+'
compile('com.google.api-client:google-api-client-android:1.20.0') {
exclude group: 'org.apache.httpcomponents'
}
compile('com.google.apis:google-api-services-drive:v3-rev6-1.20.0') {
exclude group: 'org.apache.httpcomponents'
}
}
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath "com.newrelic.agent.android:agent-gradle-plugin:5.3.1"
}
}
repositories {
mavenCentral()
// for downloading polypicker dependency cwac-camera
maven {
url "https://repo.commonsware.com.s3.amazonaws.com"
}
// for downloading poly-picker now we are using jitpack.
// Goodbye Maven Central
maven {
url "https://jitpack.io"
}
}
apply plugin: 'android'
apply plugin: 'newrelic'
dependencies {
compile 'com.android.support:support-v4:22.2.1'
}
android {
useLibrary 'org.apache.http.legacy'
}
The problem about this implementation is, it still shows snackbar (that latlng is inside bounds) even if latlng is outside bounds up to a certain level like there is some buffer area where it will still detect the latlng. I want it to be precise. How can I rectify this?
Upvotes: 1
Views: 897
Reputation: 18262
You can use the PolyUtil.containsLocation
method from the Google Maps Android API Utility Library to check if a given location lies inside a polygon represented by a List<LatLng>
instead of just checking if the location is in the boundary.
Example:
// Construct a List<LatLng> representing a Polygon
List<LatLng> polygon = new ArrayList<>();
polygon.add(new LatLng(3,0));
polygon.add(new LatLng(3,3));
polygon.add(new LatLng(0,3));
polygon.add(new LatLng(3,0));
// Find the LatLngBounds of the Polygon
LatLngBounds.Builder builder = new LatLngBounds.Builder();
for (LatLng point : polygon) {
builder.include(point);
}
LatLng test = new LatLng(1,1);
boolean isInsideBoundary = builder.build().contains(test); // true as the test point is inside the boundary
boolean isInside = PolyUtil.containsLocation(test, polygon, true); // false as the test point is outside the polygon
Upvotes: 2