Aplikacja GIS – Spring, GDAL i MongoDB

Sprawdzanie gmin w tracku

Potrzebny jest kontroler z metodą, która przyjmuje uploadowany plik. Następnie plik zapisujemy w jakimś tempie z unikalną nazwą, dokonujemy konwersji do JSON, a ten deserializujemy do GeoJSON. Niestety, klasy Springowe niezbyt się nadają, bo nie mają setterów, które chce ObjectMapper z Jackson. Rozwiązaniem jest napisanie własnych, które implementują ten interfejs.

@Data
@NoArgsConstructor
public class GeoJsonPoint implements GeoJson<Iterable<Double>> {
    private final String type = "Point";
    PointTuple coordinates;

    public GeoJsonPoint(double x, double y) {
        coordinates=new PointTuple(x,y);
    }
    public void setCoordinates(List<Double> list){
        coordinates= new PointTuple(list.get(0),list.get(1));
    }
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class PointTuple implements Iterable<Double>{
        Double x;
        Double y;

        @Override
        public Iterator<Double> iterator() {
            return new Iterator<Double>() {
                int index=0;
                @Override
                public boolean hasNext() {
                    if(index<2)
                        return true;
                    return false;
                }

                @Override
                public Double next() {
                    index++;
                    if(index==1)
                        return x;
                    else if (index==2)
                        return y;
                    return null;
                }
            };
        }
    }
}
@Data
@NoArgsConstructor
public class GeoJsonMultiLineString implements GeoJson<Iterable<GeoJsonLineString>>{
    private final String type = "MultiLineString";
    List<GeoJsonLineString> coordinates = new ArrayList<>();

    public GeoJsonMultiLineString(List<GeoJsonLineString> coordinates) {
        this.coordinates=coordinates;
    }

    public void setCoordinates(List<List<List<Double>>> value){
        coordinates = new ArrayList<GeoJsonLineString>();
        for (List<List<Double>> it:value) {
            GeoJsonLineString lineString = new GeoJsonLineString();
            lineString.setCoordinates(it);
            coordinates.add(lineString);
        }

    }
}

GeoJSON MultiLineString składa się z listy LineString, a ten składa się z listy Point. W ten sposób możemy zaimplementować wszystkie klasy GeoJSON. Należy też przerobić konwertery z org.springframework.data.mongodb.core.convert.GeoConverters. Dzięki temu można bezpośrednio używać własnych klas do komunikacji z MongoDB. Rejestrujemy je poprzez rozszerzenie klasy CustomConverters i przekazanie jej listy konwerterów.

Jeśli mamy już track w postaci GeoJSON, to wystarczy zawołać zrobioną wcześniej metodę z GminaRepository. Zwróci ona listę gmin, którą odsyłamy w zwrotce.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *