Skip to content
Snippets Groups Projects
Select Git revision
  • a20bc461c45398c20eb4a7192010335904a52be3
  • main default protected
2 results

OSMFetcher.java

Blame
  • user avatar
    kraleva authored
    a20bc461
    History
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    OSMFetcher.java 3.96 KiB
    package map.builder.osm;
    
    import static map.builder.osm.json.serialization.OSMJsonDtoDeserializer.Mode.NODES_AND_WAYS;
    import static map.builder.osm.json.serialization.OSMJsonDtoDeserializer.Mode.TURN_RESTRICTIONS;
    
    import java.io.DataOutputStream;
    import java.io.File;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.stream.Collectors;
    
    import com.google.gson.Gson;
    import com.google.gson.GsonBuilder;
    import com.google.gson.stream.JsonReader;
    
    import map.builder.osm.json.model.OSMJsonDto;
    import map.builder.osm.json.serialization.OSMJsonDtoDeserializer;
    import map.builder.utilities.BoundingBox;
    
    public class OSMFetcher {
        private final static String OverpassURL = "https://overpass.kumi.systems/api/interpreter";
        private final static String nodeQuery = "[out:json];way[highway](%s);(._;>;);out;";
        private final static String relationQuery = "[out:json];(._;>;);relation[\"type\"=\"restriction\"](%s);(._;>;);out meta;";
    
        private OSMFetcher() {
        }
    
        public static List<OSMJsonDto> fetchTurnRestrictions(BoundingBox boundingBox) throws IOException {
            System.out.println("Start to fetch turn restrictions.");
            List<OSMJsonDto> dtos = OSMFetcher.runQueryForBBox(OSMFetcher.relationQuery, boundingBox, TURN_RESTRICTIONS);
            System.out.println("Turn restrictions fetched.");
    
            return dtos;
        }
    
        public static List<OSMJsonDto> fetchNodesAndWays(BoundingBox boundingBox) throws IOException {
            System.out.println("Start to fetch nodes and ways.");
            List<OSMJsonDto> dtos = OSMFetcher.runQueryForBBox(OSMFetcher.nodeQuery, boundingBox, NODES_AND_WAYS);
            System.out.println("Nodes and ways fetched.");
    
            return dtos;
        }
    
        private static List<OSMJsonDto> runQueryForBBox(String query, BoundingBox bbox, OSMJsonDtoDeserializer.Mode mode)
                throws IOException {
            InputStream response = requestData(query, bbox);
    
            JsonReader jsonReader = new JsonReader(new InputStreamReader(response));
            List<OSMJsonDto> dtos = new ArrayList<>();
    
            Gson gson = new GsonBuilder()
                    .registerTypeAdapter(OSMJsonDto.class, new OSMJsonDtoDeserializer(mode))
                    .create();
    
            jsonReader.beginObject();
            String key;
            while ((key = jsonReader.nextName()) != null) {
                if (key.equals("elements")) {
                    jsonReader.beginArray();
                    while (jsonReader.hasNext()) {
                        OSMJsonDto dto = gson.fromJson(jsonReader, OSMJsonDto.class);
    
                        if (dto != null) {
                            dtos.add(dto);
                        }
                    }
    
                    break;
                }
                jsonReader.skipValue();
            }
    
            return dtos;
        }
    
        private static InputStream requestData(String query, BoundingBox bbox) throws IOException {
            URL url = new URL(OverpassURL);
    
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("POST");
            connection.setUseCaches(false);
            connection.setDoOutput(true);
    
            String queryString = String.format(query, bbox.getQueryString());
    
            DataOutputStream wr = new DataOutputStream(
                    connection.getOutputStream());
            wr.writeBytes(queryString);
            wr.close();
    
            return connection.getInputStream();
        }
    
        public static void dumpJsonData(List<OSMJsonDto> data, String path) throws IOException {
            File yourFile = new File(path);
            yourFile.createNewFile();
            FileWriter file = new FileWriter(path);
            file.write(
                    "[" +
                            data.stream()
                                    .map(OSMJsonDto::toJson)
                                    .collect(Collectors.joining(", "))
                            + "]");
            file.close();
        }
    }