Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Overture datasets #50

Merged
merged 4 commits into from
Nov 11, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@
import org.openstreetmap.josm.tools.HttpClient;
import org.openstreetmap.josm.tools.JosmRuntimeException;
import org.openstreetmap.josm.tools.Logging;
import org.openstreetmap.josm.tools.Utils;

import jakarta.json.Json;
import jakarta.json.JsonValue;
Expand Down Expand Up @@ -368,30 +369,33 @@ private static DataSet loadTile(TileSource tileSource, TileXYZ tileXYZ, InputStr
}
final var ds = new DataSet();
final var primitiveMap = new HashMap<PrimitiveId, OsmPrimitive>(tile.getData().getAllPrimitives().size());
for (VectorPrimitive p : tile.getData().getAllPrimitives()) {
final OsmPrimitive osmPrimitive;
if (p instanceof VectorNode node) {
osmPrimitive = new Node(node.getCoor());
osmPrimitive.putAll(node.getKeys());
} else if (p instanceof VectorWay way) {
final var tWay = new Way();
for (VectorNode node : way.getNodes()) {
tWay.addNode((Node) primitiveMap.get(node));
}
tWay.putAll(way.getKeys());
osmPrimitive = tWay;
} else if (p instanceof VectorRelation vectorRelation) {
final var tRelation = new Relation();
for (VectorRelationMember member : vectorRelation.getMembers()) {
tRelation.addMember(new RelationMember(member.getRole(), primitiveMap.get(member.getMember())));
for (Class<? extends VectorPrimitive> clazz : Arrays.asList(VectorNode.class, VectorWay.class,
VectorRelation.class)) {
for (VectorPrimitive p : Utils.filteredCollection(tile.getData().getAllPrimitives(), clazz)) {
final OsmPrimitive osmPrimitive;
if (p instanceof VectorNode node) {
osmPrimitive = new Node(node.getCoor());
osmPrimitive.putAll(node.getKeys());
} else if (p instanceof VectorWay way) {
final var tWay = new Way();
for (VectorNode node : way.getNodes()) {
tWay.addNode((Node) primitiveMap.get(node));
}
tWay.putAll(way.getKeys());
osmPrimitive = tWay;
} else if (p instanceof VectorRelation vectorRelation) {
final var tRelation = new Relation();
for (VectorRelationMember member : vectorRelation.getMembers()) {
tRelation.addMember(new RelationMember(member.getRole(), primitiveMap.get(member.getMember())));
}
tRelation.putAll(vectorRelation.getKeys());
osmPrimitive = tRelation;
} else {
throw new IllegalDataException("Unknown vector data type: " + p);
}
tRelation.putAll(vectorRelation.getKeys());
osmPrimitive = tRelation;
} else {
throw new IllegalDataException("Unknown vector data type: " + p);
ds.addPrimitive(osmPrimitive);
primitiveMap.put(p, osmPrimitive);
}
ds.addPrimitive(osmPrimitive);
primitiveMap.put(p, osmPrimitive);
}
return ds;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@
import org.openstreetmap.josm.gui.progress.swing.PleaseWaitProgressMonitor;
import org.openstreetmap.josm.gui.util.GuiHelper;
import org.openstreetmap.josm.io.IllegalDataException;
import org.openstreetmap.josm.io.OsmApiException;
import org.openstreetmap.josm.io.OsmTransferException;
import org.openstreetmap.josm.plugins.mapwithai.MapWithAIPlugin;
import org.openstreetmap.josm.plugins.mapwithai.commands.MapWithAIAddCommand;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
import org.openstreetmap.josm.plugins.mapwithai.data.mapwithai.MapWithAIInfo.MapWithAIPreferenceEntry;
import org.openstreetmap.josm.plugins.mapwithai.io.mapwithai.ESRISourceReader;
import org.openstreetmap.josm.plugins.mapwithai.io.mapwithai.MapWithAISourceReader;
import org.openstreetmap.josm.plugins.mapwithai.io.mapwithai.OvertureSourceReader;
import org.openstreetmap.josm.plugins.mapwithai.spi.preferences.MapWithAIConfig;
import org.openstreetmap.josm.spi.preferences.Config;
import org.openstreetmap.josm.tools.ListenerList;
Expand Down Expand Up @@ -333,6 +334,7 @@ protected void loadSource(String source) {
// This is called here to "pre-cache" the layer information, to avoid blocking
// the EDT
this.updateEsriLayers(result);
this.updateOvertureLayers(result);
newLayers.addAll(result);
} catch (IOException ex) {
loadError = true;
Expand Down Expand Up @@ -364,6 +366,24 @@ private void updateEsriLayers(@Nonnull final Collection<MapWithAIInfo> layers) {
layers.addAll(esriInfo);
}

/**
* Update the overture layers
* @param layers The layers to iterate through and modify
* @throws IOException If something happens while parsing overture layers
*/
private void updateOvertureLayers(@Nonnull final Collection<MapWithAIInfo> layers) throws IOException {
final var overtureLayers = new ArrayList<MapWithAIInfo>(4);
for (var layer : layers) {
if (MapWithAIType.OVERTURE == layer.getSourceType()) {
try (var reader = new OvertureSourceReader(layer)) {
reader.parse().ifPresent(overtureLayers::addAll);
}
}
}
layers.removeIf(layer -> MapWithAIType.OVERTURE == layer.getSourceType());
layers.addAll(overtureLayers);
}

protected void finish() {
defaultLayers.clear();
synchronized (allDefaultLayers) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
*/
public enum MapWithAIType implements ISourceType<MapWithAIType> {
FACEBOOK("facebook"), THIRD_PARTY("thirdParty"), ESRI("esri"), ESRI_FEATURE_SERVER(
"esriFeatureServer"), MAPBOX_VECTOR_TILE("mvt"), PMTILES("pmtiles");
"esriFeatureServer"), MAPBOX_VECTOR_TILE("mvt"), PMTILES("pmtiles"), OVERTURE("overture");

private final String typeString;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ public MapWithAIDefaultLayerTableModel() {
columnDataRetrieval.add(info -> Optional.ofNullable(info.getTermsOfUseURL()).orElse(""));
columnDataRetrieval.add(i -> MapWithAILayerInfo.getInstance().getLayers().contains(i));
MapWithAILayerInfo.getInstance().addFinishListener(() -> GuiHelper.runInEDT(this::fireTableDataChanged));
MapWithAILayerInfo.SHOW_PREVIEW.addWeakListener(l -> GuiHelper.runInEDT(this::fireTableDataChanged));
}

/**
Expand All @@ -60,10 +61,11 @@ public MapWithAIDefaultLayerTableModel() {
* @return The imagery info at the given row number
*/
public static MapWithAIInfo getRow(int row) {
if (row == 0 && MapWithAILayerInfo.getInstance().getAllDefaultLayers().isEmpty()) {
final var layers = MapWithAILayerInfo.getInstance().getAllDefaultLayers();
if (row == 0 && layers.isEmpty()) {
return new MapWithAIInfo(tr("Loading"), "");
}
return MapWithAILayerInfo.getInstance().getAllDefaultLayers().get(row);
return layers.get(row);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,12 @@

import org.openstreetmap.josm.io.CachedFile;
import org.openstreetmap.josm.tools.HttpClient;
import org.openstreetmap.josm.tools.Logging;
import org.openstreetmap.josm.tools.Utils;

import jakarta.json.Json;
import jakarta.json.JsonObject;
import jakarta.json.JsonReader;
import jakarta.json.JsonStructure;
import jakarta.json.JsonValue;
import jakarta.json.stream.JsonParser;
import jakarta.json.stream.JsonParsingException;

/**
* Read sources for MapWithAI
Expand Down Expand Up @@ -42,24 +41,26 @@ public Optional<T> parse() throws IOException {
this.cachedFile = new CachedFile(this.source);
}
this.cachedFile.setFastFail(this.fastFail);
try (JsonReader reader = Json.createReader(cachedFile.setMaxAge(CachedFile.DAYS)
try (JsonParser reader = Json.createParser(cachedFile.setMaxAge(CachedFile.DAYS)
.setCachingStrategy(CachedFile.CachingStrategy.IfModifiedSince).getContentReader())) {
JsonStructure struct = reader.read();
if (JsonValue.ValueType.OBJECT == struct.getValueType()) {
final var jsonObject = struct.asJsonObject();
return Optional.ofNullable(this.parseJson(jsonObject));
while (reader.hasNext()) {
if (reader.hasNext() && reader.next() == JsonParser.Event.START_OBJECT) {
return Optional.ofNullable(this.parseJson(reader));
}
}
return Optional.empty();
} catch (JsonParsingException jsonParsingException) {
Logging.error(jsonParsingException);
}
return Optional.empty();
}

/**
* Parses MapWithAI entry sources
*
* @param jsonObject The json of the data sources
* @param parser The json of the data sources. This will be in the {@link JsonParser.Event#START_OBJECT} state.
* @return The parsed entries
*/
public abstract T parseJson(JsonObject jsonObject);
public abstract T parseJson(JsonParser parser);

/**
* Sets whether opening HTTP connections should fail fast, i.e., whether a
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@
import org.openstreetmap.josm.plugins.mapwithai.data.mapwithai.MapWithAICategory;
import org.openstreetmap.josm.tools.Pair;

import jakarta.json.JsonObject;
import jakarta.json.JsonString;
import jakarta.json.JsonValue;
import jakarta.json.stream.JsonParser;

/**
* Read conflation entries from JSON
Expand Down Expand Up @@ -44,12 +44,12 @@ public ConflationSourceReader(String source) {
/**
* Parses MapWithAI entry sources
*
* @param jsonObject The json of the data sources
* @param parser The json of the data sources
* @return The parsed entries
*/
@Override
public Map<MapWithAICategory, List<String>> parseJson(JsonObject jsonObject) {
return jsonObject.entrySet().stream().flatMap(i -> parse(i).stream())
public Map<MapWithAICategory, List<String>> parseJson(JsonParser parser) {
return parser.getObjectStream().flatMap(i -> parse(i).stream())
.collect(Collectors.groupingBy(p -> p.a, Collectors.mapping(p -> p.b, Collectors.toList())));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ private ForkJoinTask<MapWithAIInfo> parse(JsonObject feature) {
newInfo.setName(feature.getString("title", feature.getString("name")));
final var extent = feature.getJsonArray("extent").getValuesAs(JsonArray.class).stream()
.flatMap(array -> array.getValuesAs(JsonNumber.class).stream()).map(JsonNumber::doubleValue)
.map(Object::toString).toArray(String[]::new);
.map(d -> Double.toString(d)).toArray(String[]::new);
final var imageryBounds = new ImageryBounds(String.join(",", extent[1], extent[0], extent[3], extent[2]), ",");
newInfo.setBounds(imageryBounds);
newInfo.setSourceType(MapWithAIType.ESRI_FEATURE_SERVER);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@
import org.openstreetmap.josm.plugins.mapwithai.data.mapwithai.MapWithAIType;
import org.openstreetmap.josm.tools.Territories;

import jakarta.json.JsonObject;
import jakarta.json.JsonString;
import jakarta.json.JsonValue;
import jakarta.json.stream.JsonParser;

/**
* Reader to parse the list of available MapWithAI servers from an JSON
Expand Down Expand Up @@ -54,12 +54,12 @@ public MapWithAISourceReader(String source) {
/**
* Parses MapWithAI entry sources
*
* @param jsonObject The json of the data sources
* @param parser The json of the data sources
* @return The parsed entries
*/
@Override
public List<MapWithAIInfo> parseJson(JsonObject jsonObject) {
return jsonObject.entrySet().stream().map(MapWithAISourceReader::parse).collect(Collectors.toList());
public List<MapWithAIInfo> parseJson(JsonParser parser) {
return parser.getObjectStream().map(MapWithAISourceReader::parse).collect(Collectors.toList());
}

private static MapWithAIInfo parse(Map.Entry<String, JsonValue> entry) {
Expand Down
Loading