Android Mapbox - 从 GeoJson 文件中归档,以便仅显示某些 属性 的点

Android Mapbox - Filering from GeoJson file so that only points with certain property show

浏览并寻找答案但未能找到答案 - 希望这不是双重答案。

基本上,我正在开发的应用程序中的 activity 只会在 mapbox 地图上显示点(在 circlelayer 上) - 但只有当它们的功能 属性 设置为 true(布尔值- 它的值可以从同一应用程序中的另一个 activity 更改,具体取决于您是否访问过该位置)。

这是Json

{
  "features": [
    {
      "type": "Feature",
      "properties": {
        "title": "name of place",
        "Country": "countryname",
        "Region": "regionname",
        "poi": "Monument",
        "selected": false,
        "Visited": false, //This value here is to be filtered
        "Visityear": "No",
        "Visitmonth": "No",
      },
      "geometry": {
        "coordinates": [
          25.588019,
          45.641036
        ],
        "type": "Point"

...etc, more values, etc

现在,布尔值可以从另一个 activity 设置为 true 或 false,但是在这个特定的地图上 - 我只需要有简单的地图,但只显示“访问过”的点是“真”

            private void addPointsLayer(@NonNull Style loadedMapStyle) {
                CircleLayer Seenlayer = new CircleLayer("points", GEOJSON_SOURCE_ID);
                Seenlayer.setProperties(
                        PropertyFactory.circleColor(Color.RED),
                        PropertyFactory.circleRadius(2f),
                        PropertyFactory.circleOpacity(0.4f));
                Seenlayer.setFilter(
                        Expression.all(
                                eq(literal("$type"), literal("Point")),
                                eq(get("Visited"), true))); //Im sure its something here!
                loadedMapStyle.addLayer(Seenlayer);
            }

尝试了几个选项 - 但要么根本没有显示任何点,要么无论“已访问”的值如何,它们都会显示

很确定 CircleLayer 只考虑 Point 几何图形,因此不需要在过滤器中包含几何图形类型。现在,我只是将它留在您的代码中。一旦其他一切正常,您始终可以通过删除它来进行试验。

尝试

Seenlayer.setFilter(
                    Expression.all(
                            eq(geometryType(), literal("Point")),
                            eq(get("Visited"), true)));

如果还是不行,试试:

Seenlayer.setFilter(
                    Expression.all(
                            eq(geometryType(), literal("Point")),
                            eq(get("Visited"), literal(true))));

有几个 Mapbox Android 演示应用程序示例依赖于您尝试在代码中设置的 select 状态切换功能。将布尔值包装在 literal() 中似乎是让它工作的关键

https://github.com/mapbox/mapbox-android-demo/search?q=%22++++++.withFilter%28eq%28%28get%28PROPERTY_SELECTED%29%29%2C+literal%28true%29%29%29%29%3B%22&unscoped_q=%22++++++.withFilter%28eq%28%28get%28PROPERTY_SELECTED%29%29%2C+literal%28true%29%29%29%29%3B%22

你的情况是 literal(true)