Rev 529 |
Blame |
Compare with Previous |
Last modification |
View Log
| RSS feed
/*
* Copyright (c) 2014, Gerd Petermann
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*/
package uk.me.parabola.splitter.solver;
import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
import uk.me.parabola.splitter.AbstractMapProcessor;
import uk.me.parabola.splitter.Node;
import uk.me.parabola.splitter.RoundingUtils;
import uk.me.parabola.splitter.Utils;
import uk.me.parabola.splitter.Way;
import java.awt.geom.Path2D;
import java.awt.geom.Area;
import java.util.ArrayList;
import java.util.List;
/**
*
* Class to read a polygon description file (OSM)
* Expected input are nodes and ways. Ways with
* tag name=* and mapid=nnnnnnnn should describe polygons
* which are used to calculate area lists.
* @author GerdP
*
*/
class PolygonDescProcessor
extends AbstractMapProcessor
{
private Long2ObjectOpenHashMap
<Node> nodes =
new Long2ObjectOpenHashMap
<>();
private final List<PolygonDesc
> polygonDescriptions =
new ArrayList<>();
private final int shift
;
public PolygonDescProcessor
(int resolution
) {
this.
shift =
24 - resolution
;
}
@
Override
public void processNode
(Node n
){
// round all coordinates to be on the used grid.
int lat = RoundingUtils.
round(n.
getMapLat(), shift
);
int lon = RoundingUtils.
round(n.
getMapLon(), shift
);
double roundedLat = Utils.
toDegrees(lat
);
double roundedLon = Utils.
toDegrees(lon
);
Node rNode =
new Node();
rNode.
set(n.
getId(),roundedLat,roundedLon
);
nodes.
put(rNode.
getId(), rNode
);
}
@
Override
public void processWay
(Way w
){
String name = w.
getTag("name");
if (name ==
null){
System.
out.
println("name missing, ignoring way " + w.
getId());
return;
}
String mapIdString = w.
getTag("mapid");
if (mapIdString ==
null){
System.
out.
println("mapid missing, ignoring way " + w.
getId());
return;
}
int mapId
;
try{
mapId =
Integer.
parseInt(mapIdString
);
} catch (NumberFormatException e
){
System.
out.
println("invalid mapid in way " + w.
getId());
return;
}
Path2D path =
null;
for (long ref : w.
getRefs()){
Node n = nodes.
get(ref
);
if (n
!=
null){
if (path ==
null){
path =
new Path2D.
Double();
path.
moveTo(n.
getMapLon(), n.
getMapLat());
} else
path.
lineTo(n.
getMapLon(), n.
getMapLat());
}
}
PolygonDesc pd =
new PolygonDesc
(name,
new Area(path
), mapId
);
polygonDescriptions.
add(pd
);
}
@
Override
public boolean endMap
(){
nodes =
null;
System.
out.
println("found " + polygonDescriptions.
size() +
" named polygons");
return true;
}
public List<PolygonDesc
> getPolygons
() {
return polygonDescriptions
;
}
}