1

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?

duncan
32k15 gold badges84 silver badges103 bronze badges
asked Mar 22, 2016 at 9:28

1 Answer 1

2

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
answered Mar 22, 2016 at 9:33
Sign up to request clarification or add additional context in comments.

7 Comments

While including library i am getting error:Error:Execution failed for task ':needToPark:processDebugResources'. > Error: more than one library with package name 'com.google.maps.android' You can temporarily disable this error with android.enforceUniquePackageName=false However, this is temporary and will be enforced in 1.0
How are you including the library? To add it to your project just add compile 'com.google.maps.android:android-maps-utils:0.4+' to the dependencies section in your build.gradle
That is what i did. Still getting the same issue. I am trying to figure out why I am getting that error. Added compile 'com.google.maps.android:android-maps-utils:0.4+' in build.gradle
Can you share your build.gradle?
Take a look at stackoverflow.com/questions/27665105/…. I would recommend to remove all the dependencies com.google.android.gms:play-services* and add the dependency compile 'com.google.android.gms:play-services:8.3.0'
|

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.