使用位置

时间:2016-11-29 08:52:20

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

我想编写一个可以判断用户是否在林中的应用程序。 有没有办法使用android?

我尝试了什么:

  1. 使用Google的Places API,并希望每当用户在林中时,都会获得地点类型“natural_feature”。不幸的是,我大部分时间都得到“ZERO_RESULTS”

  2. 了解显示森林区域并尝试将其置于GoogleMap之上的WMS图层。没有得到它的工作,并注意到我很可能只能显示地图不检查用户是否在该层的其中一个区域...

  3. 有没有办法检查当前位置是否在谷歌地图上的绿色区域?如果其他一切都失败,这甚至可能就足够了。

    提前致谢!

1 个答案:

答案 0 :(得分:1)

我目前不知道是否有更简单的方法可以执行此操作,但您可以尝试以下操作:

  1. 从地图中获取快照
  2. 获取快照的平均颜色
  3. 将平均颜色与预定义的森林颜色进行比较
  4. 如果他们的差异低于您接受的容差,那么您就是在 地图绿地
  5. 如果您没有放大地图并且绿色区域太小,结果可能不准确。在这种情况下,您只能在特定的缩放级别上进行计算。

            final int forestR = 214;
            final int forestG = 233;
            final int forestB = 215;
            final int tolerance = 60;
    
            Button button = (Button) findViewById(R.id.check_forest_btn);
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    GoogleMap.SnapshotReadyCallback callback = new GoogleMap.SnapshotReadyCallback() {
    
    
                        @Override
                        public void onSnapshotReady(Bitmap snapshot) {
                            int pixelCount = 0;
                            int redColors = 0;
                            int greenColors = 0;
                            int blueColors = 0;
                            for (int y = 0; y < snapshot.getHeight(); y++) {
                                for (int x = 0; x < snapshot.getWidth(); x++) {
                                    int c = snapshot.getPixel(x, y);
                                    pixelCount++;
                                    redColors += Color.red(c);
                                    greenColors += Color.green(c);
                                    blueColors += Color.blue(c);
                                }
                            }
                            // calculate average of bitmap r,g,b values
                            int red = (redColors / pixelCount);
                            int green = (greenColors / pixelCount);
                            int blue = (blueColors / pixelCount);
    
                            int difference = Math.abs(red - forestR) + Math.abs(green - forestG) + Math.abs(blue - forestB);
    
                            boolean isForest = difference < tolerance;//use this to display your information
                        }
                    };
    
                    map.snapshot(callback);
                }
            });