【问题标题】:Searching Latlng inside Polygon is not precise在 Polygon 内搜索 Latlng 并不精确
【发布时间】:2016-03-22 09:28:50
【问题描述】:

我正在尝试检查地图中心是否在多边形内。我在地图上创建多个多边形的代码是这样的:

    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);
        }

接下来我检查地图中心是否在任何多边形内

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;
                         }
                    }
            }
        }
    });

这是我的 build.gradle 以防万一

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'
}

这个实现的问题是,它仍然显示snackbar(latlng 在边界内),即使latlng 超出一定水平,就像有一些缓冲区仍然会检测到latlng。我希望它是精确的。我该如何纠正这个问题?

【问题讨论】:

    标签: google-maps google-maps-android-api-2


    【解决方案1】:

    您可以使用Google Maps Android API Utility Library 中的PolyUtil.containsLocation 方法来检查给定位置是否位于由List&lt;LatLng&gt; 表示的多边形内,而不仅仅是检查该位置是否在边界内。

    例子:

    // 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
    

    【讨论】:

    • 在包含库时出现错误:错误:任务“:needToPark:processDebugResources”的执行失败。 > 错误:多个库的包名称为 'com.google.maps.android' 您可以使用 android.enforceUniquePackageName=false 暂时禁用此错误但是,这是暂时的,将在 1.0 中强制执行
    • 你如何包括图书馆?要将其添加到您的项目中,只需将compile 'com.google.maps.android:android-maps-utils:0.4+' 添加到您的build.gradle 中的dependencies 部分
    • 这就是我所做的。仍然遇到同样的问题。我试图弄清楚为什么我会收到这个错误。在 build.gradle 中添加了 compile 'com.google.maps.android:android-maps-utils:0.4+'
    • 你能分享你的build.gradle吗?
    • 看看stackoverflow.com/questions/27665105/…。我建议删除所有依赖项com.google.android.gms:play-services* 并添加依赖项compile 'com.google.android.gms:play-services:8.3.0'
    猜你喜欢
    • 2011-05-13
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 2021-03-27
    • 1970-01-01
    • 2014-08-18
    • 2021-12-17
    • 2013-10-26
    相关资源
    最近更新 更多