On Sun, Aug 16, 2009 at 11:10:03PM +0200, Rudi wrote:
> Here is an update of the multipolygon patch based on mkgmap-trunk 1136.
Thanks,
I have re-made this patch against the polygon branch
at http://svn.mkgmap.org.uk/mkgmap/branches/multipolygon
which is where it will be applied.
..Steve
diff --exclude=.svn -ru
mkgmap-mp/src/uk/me/parabola/mkgmap/reader/osm/MultiPolygonRelation.java
mkg-1128/src/uk/me/parabola/mkgmap/reader/osm/MultiPolygonRelation.java
--- mkgmap-mp/src/uk/me/parabola/mkgmap/reader/osm/MultiPolygonRelation.java
2009-08-15 16:37:45.000000000 +0100
+++ mkg-1128/src/uk/me/parabola/mkgmap/reader/osm/MultiPolygonRelation.java
2009-08-18 11:45:20.000000000 +0100
@@ -1,7 +1,7 @@
package uk.me.parabola.mkgmap.reader.osm;
import java.util.ArrayList;
-import java.util.Collection;
+import java.util.Iterator;
import java.util.List;
import java.util.Map;
@@ -15,7 +15,9 @@
*/
public class MultiPolygonRelation extends Relation {
private Way outer;
- private final Collection<Way> inners = new ArrayList<Way>();
+ private List<Way> outers = new ArrayList<Way>();
+ private List<Way> inners = new ArrayList<Way>();
+ private Map<Long, Way> myWayMap;
/**
* Create an instance based on an exsiting relation. We need to do
@@ -25,6 +27,7 @@
* @param wayMap Map of all ways.
*/
public MultiPolygonRelation(Relation other, Map<Long, Way> wayMap) {
+ myWayMap = wayMap;
setId(other.getId());
for (Map.Entry<Element, String> pairs:
other.getRoles().entrySet()){
addElement(pairs.getValue(), pairs.getKey());
@@ -34,17 +37,11 @@
if (value != null && pairs.getKey() instanceof Way) {
Way way = (Way) pairs.getKey();
if (value.equals("outer")){
- // duplicate outer way and remove tags
for cascaded multipolygons
- outer = new Way(-way.getId());
- outer.copyTags(way);
- for(Coord point: way.getPoints())
- outer.addPoint(point);
- wayMap.put(outer.getId(), outer);
- if (way.getTags() != null)
- way.getTags().removeAll();
+ outers.add(way);
}
- else if (value.equals("inner"))
+ else if (value.equals("inner")){
inners.add(way);
+ }
}
}
@@ -53,26 +50,61 @@
}
/** Process the ways in this relation.
+ * Joins way with the role "outer"
* Adds ways with the role "inner" to the way with the role "outer"
*/
public void processElements() {
- if (outer != null)
- {
+ if (outers != null)
+ {
+ // copy first outer way
+ Iterator<Way> it = outers.iterator();
+ if (it.hasNext()){
+ // duplicate outer way and remove tags for
cascaded multipolygons
+ Way tempWay = it.next();
+ outer = new Way(-tempWay.getId());
+ outer.copyTags(tempWay);
+ for(Coord point: tempWay.getPoints()){
+ outer.addPoint(point);
+ }
+ myWayMap.put(outer.getId(), outer);
+ if (tempWay.getTags() != null){
+ tempWay.getTags().removeAll();
+ }
+ it.remove();
+ }
+
+ // if we have more than one outer way, we join them if
they are parts of a long way
+ it = outers.iterator();
+ while (it.hasNext()){
+ Way tempWay = it.next();
+ if (tempWay.getPoints().get(0) ==
outer.getPoints().get(outer.getPoints().size()-1)){
+ for(Coord point: tempWay.getPoints()){
+ outer.addPoint(point);
+ }
+ if (tempWay.getTags() != null){
+ tempWay.getTags().removeAll();
+ }
+ it.remove();
+ it = outers.iterator();
+ }
+ }
+
for (Way w: inners) {
- if (w != null) {
+ if (w != null && outer!= null) {
int[] insert =
findCpa(outer.getPoints(), w.getPoints());
- if (insert[0] >= 0 && insert[1] >= 0)
- insertPoints(w, insert[0],
insert[1]);
-
+ insertPoints(w, insert[0], insert[1]);
+
// remove tags from inner way that are
available in the outer way
if (outer.getTags() != null){
for (Map.Entry<String, String>
mapTags: outer.getTags().getKeyValues().entrySet()){
String key =
mapTags.getKey();
String value =
mapTags.getValue();
- if (w.getTag(key) !=
null)
- if
(w.getTag(key).equals(value))
+ if (w.getTag(key) !=
null){
+ if
(w.getTag(key).equals(value)){
w.deleteTag(key);
+ }
+ }
}
}
}
@@ -91,10 +123,12 @@
List<Coord> outList = outer.getPoints();
List<Coord> inList = way.getPoints();
int index = out+1;
- for (int i = in; i < inList.size(); i++)
+ for (int i = in; i < inList.size(); i++){
outList.add(index++, inList.get(i));
- for (int i = 0; i < in; i++)
+ }
+ for (int i = 0; i < in; i++){
outList.add(index++, inList.get(i));
+ }
if (outer.getPoints().size() < 32){
outList.add(index++, inList.get(in));
@@ -106,13 +140,15 @@
int oLon = outList.get(out).getLongitude();
int iLat = inList.get(in).getLatitude();
int iLon = inList.get(in).getLongitude();
- if ((oLat - iLat) > (oLon - iLon)){
- outList.add(index++, new Coord(iLat-1, iLon));
- outList.add(index, new Coord(oLat-1, oLon));
+ if (Math.abs(oLat - iLat) > Math.abs(oLon - iLon)){
+ int delta = (oLon > iLon)? -1 : 1;
+ outList.add(index++, new Coord(iLat + delta,
iLon));
+ outList.add(index, new Coord(oLat + delta,
oLon));
}
else{
- outList.add(index++, new Coord(iLat, iLon-1));
- outList.add(index, new Coord(oLat, oLon-1));
+ int delta = (oLat > iLat)? 1 : -1;
+ outList.add(index++, new Coord(iLat, iLon +
delta));
+ outList.add(index, new Coord(oLat, oLon +
delta));
}
}
}
_______________________________________________
mkgmap-dev mailing list
[email protected]
http://www.mkgmap.org.uk/mailman/listinfo/mkgmap-dev