Много точек GeoJSON или шейп-файлов в качестве геозон в Android?

#android #geojson #shapefile #points #geofence

#Android #geojson #шейп-файл #Очки #геозона

Вопрос:

У меня есть GEOJSON (я мог бы преобразовать его в шейп-файл или другой файл с географической привязкой) со многими точками (несколько сотен), и я хочу создать геозоны для всех них. Как мне это сделать? У меня есть весь код для получения геозоны из одной точки, но как мне создать геозоны во многих точках?

При длительном нажатии на экран будет добавлен маркер, который автоматически получает геозону

     public void onMapLongClick(LatLng latLng) { // lange Klicken, bis Marker scheint


        if (Build.VERSION.SDK_INT >= 29) {
            // We need background permission (Manifest.xml)
            if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_BACKGROUND_LOCATION) == PackageManager.PERMISSION_GRANTED) { // wenn permission granted
                tryAddingGeofence(latLng);
            } else {
                if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_BACKGROUND_LOCATION)){
                    //We show a dialog and ask for permission
                    ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.ACCESS_BACKGROUND_LOCATION}, BACKGROUND_LOCATION_ACCESS_REQUEST_CODE);
                } else {
                    ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.ACCESS_BACKGROUND_LOCATION}, BACKGROUND_LOCATION_ACCESS_REQUEST_CODE);
                }

            }
        } else {
            tryAddingGeofence(latLng);
        }
    }




    private void tryAddingGeofence(LatLng latLng) {
        mMap.clear();
        addMarker(latLng);
        addCircle(latLng, GEOFENCE_RADIUS);
        addGeofence(latLng, GEOFENCE_RADIUS);
    }


    private void addGeofence(LatLng latLng, float radius){
        Geofence geofence = geofenceHelper.getGeofence(GEOFENCE_ID, latLng, radius,
                Geofence.GEOFENCE_TRANSITION_ENTER |
                        // Geofence.GEOFENCE_TRANSITION_DWELL |
                        Geofence.GEOFENCE_TRANSITION_EXIT);   // wann wird geofence getriggert? -> reinlaufen, darin laufen oder rausgehen
        GeofencingRequest geofencingRequest = geofenceHelper.getGeofencingRequest(geofence);
        PendingIntent pendingIntent = geofenceHelper.getPendingIntent();
        geofencingClient.addGeofences(geofencingRequest, pendingIntent)
                .addOnSuccessListener(new OnSuccessListener<Void>() {
                    @Override
                    public void onSuccess(Void aVoid) {
                        Log.d(TAG, "onSuccess: Geofence Added...");
                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        String errorMessage = geofenceHelper.getErrorString(e);
                        Log.d(TAG, "onFailure: "   errorMessage);

                    }
                });
    }

    private void addMarker(LatLng latLng) {
        MarkerOptions markerOptions = new MarkerOptions().position(latLng);
        mMap.addMarker(markerOptions);
    }

    private void addCircle(LatLng latLng, float radius){
        CircleOptions circleOptions = new CircleOptions();
        circleOptions.center(latLng);
        circleOptions.radius(radius);
        circleOptions.strokeColor(Color.argb(255,255,0,0));
        circleOptions.fillColor(Color.argb(64,255,0,0));
        circleOptions.strokeWidth(4);
        mMap.addCircle(circleOptions);
    } ```
  

Комментарии:

1. Поместите свой код и модель для лучшего руководства

Ответ №1:

Я нашел простое решение для всех, у кого возникнет эта проблема: нам нужно создать список всех координат. Итак, сначала нам нужно получить координаты из файла geojson. В следующем решении у меня был файл KML, но в конце он получает тот же результат.

  1. Я создал метод, который считывает текстовый файл (сначала вам нужно преобразовать geojson или kml в .txt, а затем скопировать его в src / main / res / raw. В моем случае у меня есть «monitoring.txt «Так что не забудьте изменить имя на ваше имя файла.) В первой части он считывает .txt и сохраняет его в строку. В части scond он считывает из нее ту строку, которая находится между координатами> и Когда у вас есть GeoJSON, не забудьте посмотреть, между какими строками указаны координаты. Затем я беру эту строку (означает координаты), разделяю их и разделяю широту и долготу на double, чтобы затем я мог сохранить ее как LatLng Object. Это должно быть в цикле, чтобы каждая координата в файле kml / geojson / txt была взята и сохранена в списке «Опасная зона».
 private List<LatLng> dangerousArea = new ArrayList<>();

private void readCoordinatesFromKml() throws IOException {

        InputStream inputStream = getResources().openRawResource(R.raw.monitoring);

        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

        int i;
        try {
            i = inputStream.read();
            while (i != -1)
            {
                byteArrayOutputStream.write(i);
                i = inputStream.read();
            }
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        Pattern pattern = Pattern.compile("<coordinates>(.*?)</coordinates>", Pattern.DOTALL);
        Matcher matcher = pattern.matcher(byteArrayOutputStream.toString());
        while (matcher.find()) {

            String[] str = matcher.group(1).split(",");
            double Longitude = Double.parseDouble(str[0]);
            double Latitude = Double.parseDouble(str[1]);

            dangerousArea.add(new LatLng(Latitude, Longitude));

        }
    }
  
  1. Затем вы можете просто добавить координаты, которые хранятся в списке как геозоны. Это зависит от того, как вы назвали свой метод, который создает геозону вокруг ваших точек:
 dangerousArea.forEach(coordinate -> {tryAddingGeofence(coordinate);});
  

В последнюю очередь вам нужно посмотреть свой код, где это сделать. Обычно это функция, которая уже убедилась, что вам разрешено получать местоположение пользователя.

Комментарии:

1. В коде указано Pattern.compile("<coordinates>(.*?)</coordinates>" , что ваш формат будет: Pattern.compile("anyStringBefore(.*?)anyStringAfter")