How to render a relation with multipolygon?

324 views
Skip to first unread message

Daniele Germano

unread,
Feb 16, 2014, 11:29:41 AM2/16/14
to mapsfo...@googlegroups.com
Hi

I don't understand how to render a relation with multi polygon (in this case is a forest). i need to add something in the tag mapping or in the osmarender.xml? Do someone know how to do it?  here's the code from openstreetmap:

<relation id="2254193" visible="true" version="26" changeset="20347657" timestamp="2014-02-03T07:15:47Z" user="GiuseppeAmici_IT" uid="480488">

  <member type="way" ref="169324233" role="inner"/>

  <member type="way" ref="169468732" role="inner"/>

  <member type="way" ref="169468725" role="inner"/>

  <member type="way" ref="169468736" role="inner"/>

  <member type="way" ref="169468727" role="inner"/>

  <member type="way" ref="169468729" role="inner"/>

  <member type="way" ref="169487414" role="inner"/>

  <member type="way" ref="169487422" role="inner"/>

  <member type="way" ref="169487421" role="inner"/>

  <member type="way" ref="169487425" role="inner"/>

  <member type="way" ref="169487423" role="inner"/>

  <member type="way" ref="169488733" role="inner"/>

  <member type="way" ref="169981279" role="inner"/>

  <member type="way" ref="169981557" role="inner"/>

  <member type="way" ref="169981558" role="inner"/>

  <member type="way" ref="169981559" role="inner"/>

  <member type="way" ref="169981545" role="inner"/>

  <member type="way" ref="169981555" role="inner"/>

  <member type="way" ref="169981543" role="inner"/>

  <member type="way" ref="169981556" role="inner"/>

  <member type="way" ref="169981544" role="inner"/>

  <member type="way" ref="169847334" role="outer"/>

  <member type="way" ref="170310011" role="inner"/>

  <member type="way" ref="170310012" role="inner"/>

  <member type="way" ref="170310013" role="inner"/>

  <member type="way" ref="170310015" role="inner"/>

  <member type="way" ref="170317250" role="outer"/>

  <member type="way" ref="170317267" role="outer"/>

  <member type="way" ref="170151568" role="inner"/>

  <member type="way" ref="170152627" role="inner"/>

  <member type="way" ref="170152630" role="inner"/>

  <member type="way" ref="170152674" role="inner"/>

  <member type="way" ref="170152622" role="inner"/>

  <member type="way" ref="170152625" role="inner"/>

  <member type="way" ref="170152723" role="inner"/>

  <member type="way" ref="170152675" role="outer"/>

  <member type="way" ref="170152633" role="outer"/>

  <member type="way" ref="170267295" role="outer"/>

  <member type="way" ref="170261068" role="inner"/>

  <member type="way" ref="170261070" role="inner"/>

  <member type="way" ref="170152113" role="inner"/>

  <member type="way" ref="170151518" role="inner"/>

  <member type="way" ref="170152114" role="inner"/>

  <member type="way" ref="170138187" role="inner"/>

  <member type="way" ref="170136797" role="inner"/>

  <member type="way" ref="170135138" role="inner"/>

  <member type="way" ref="170135137" role="inner"/>

  <member type="way" ref="170135142" role="inner"/>

  <member type="way" ref="169488702" role="inner"/>

  <member type="way" ref="169487417" role="inner"/>

  <member type="way" ref="169487420" role="inner"/>

  <member type="way" ref="169487419" role="inner"/>

  <member type="way" ref="169468737" role="inner"/>

  <member type="way" ref="169468731" role="inner"/>

  <member type="way" ref="169468734" role="inner"/>

  <member type="way" ref="169324235" role="inner"/>

  <member type="way" ref="169277091" role="inner"/>

  <member type="way" ref="169488729" role="inner"/>

  <member type="way" ref="170317271" role="inner"/>

  <tag k="landuse" v="forest"/>

  <tag k="type" v="multipolygon"/>

 </relation>



Ludwig

unread,
Feb 16, 2014, 10:10:13 PM2/16/14
to mapsfo...@googlegroups.com
The most common error with multipolygons is that the data is not actually valid. 
If you had loaded this relation in josm it would have told you that an inner part of the multipolygon was intersecting with the outer line, rendering it invalid. 

Mapsforge deals with some errors in the OSM data, but in general it is difficult to do so. If you turn on debugging in the mapfile writer you will get some error messages about relations that are dropped.

I have fixed this particular case in the OSM data and I assume the problem will have gone away. (Depending on your data source, you might have to wait a day or two to get the latest data).

Ludwig


--
You received this message because you are subscribed to the Google Groups "mapsforge-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to mapsforge-de...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/mapsforge-dev/f7a0e822-3ade-4d9e-a3f0-e8d5e8123fbd%40googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

Daniele Germano

unread,
Feb 17, 2014, 4:30:03 AM2/17/14
to mapsfo...@googlegroups.com
Thanks for the answer Ludwig

i use osmosis to convert osm data in map files, how can i turn on the debugging in the map file writer?

The above code is related to this url:  http://www.openstreetmap.org/#map=13/43.9192/11.1497

Thanks for your support

Ludwig

unread,
Feb 17, 2014, 4:47:25 AM2/17/14
to mapsfo...@googlegroups.com

Daniele Germano

unread,
Feb 17, 2014, 9:04:32 AM2/17/14
to mapsfo...@googlegroups.com
Thanks Ludwig

As you say, osmosis reported this messages

relation contains dangling ways which could not be merged to polygons: 2772370

relation contains dangling ways which could not be merged to polygons: 2772370


 JTS cannot clip way, not storing it in data file: 260946819

com.vividsolutions.jts.geom.TopologyException: found non-noded intersection between LINESTRING ( 0.29833900000000035 0.16789099999999735, 0.29703499999999927 0.16720800000000224 ) and LINESTRING ( 0.297034 0.1673060000000035, 0.2973339999999993 0.16702899999999943 ) [ (0.2971020832985933, 0.167243136420968, NaN) ]

at com.vividsolutions.jts.noding.FastNodingValidator.checkValid(FastNodingValidator.java:109)

at com.vividsolutions.jts.geomgraph.EdgeNodingValidator.checkValid(EdgeNodingValidator.java:80)

at com.vividsolutions.jts.operation.overlay.OverlayOp.computeOverlay(OverlayOp.java:162)

at com.vividsolutions.jts.operation.overlay.OverlayOp.getResultGeometry(OverlayOp.java:127)

at com.vividsolutions.jts.operation.overlay.OverlayOp.overlayOp(OverlayOp.java:66)

at com.vividsolutions.jts.operation.overlay.snap.SnapOverlayOp.getResultGeometry(SnapOverlayOp.java:68)

at com.vividsolutions.jts.operation.overlay.snap.SnapOverlayOp.overlayOp(SnapOverlayOp.java:25)

at com.vividsolutions.jts.operation.overlay.snap.SnapIfNeededOverlayOp.getResultGeometry(SnapIfNeededOverlayOp.java:76)

at com.vividsolutions.jts.operation.overlay.snap.SnapIfNeededOverlayOp.overlayOp(SnapIfNeededOverlayOp.java:25)

at com.vividsolutions.jts.geom.Geometry.intersection(Geometry.java:1082)

at org.mapsforge.map.writer.util.GeoUtils.clipToTile(GeoUtils.java:174)

at org.mapsforge.map.writer.MapFileWriter.preprocessWay(MapFileWriter.java:709)

at org.mapsforge.map.writer.MapFileWriter.processTile(MapFileWriter.java:468)

at org.mapsforge.map.writer.MapFileWriter.writeSubfile(MapFileWriter.java:353)

at org.mapsforge.map.writer.MapFileWriter.writeFile(MapFileWriter.java:160)

at org.mapsforge.map.writer.osmosis.MapFileWriterTask.complete(MapFileWriterTask.java:105)

at org.openstreetmap.osmosis.core.sort.v0_6.EntitySorter.complete(EntitySorter.java:65)

at org.openstreetmap.osmosis.xml.v0_6.XmlReader.run(XmlReader.java:110)

at java.lang.Thread.run(Thread.java:744)


I grab the data from OpenStreetMap (Overpass Api)

Il giorno lunedì 17 febbraio 2014 04:10:13 UTC+1, Ludwig ha scritto:

Ludwig

unread,
Feb 17, 2014, 9:15:10 AM2/17/14
to mapsfo...@googlegroups.com
The first error you get if there are way segments left over when constructing a polygon. IIRC this mostly happens if you clip an OSM file and some parts of a relation are lost. There are some options to osmosis that avoid this (this is not a mapsforge thing, best to consult the osmosis docs. Geofabrik data is good at avoiding this).

The second error you get when you have a self-intersecting polygon. 

OSM data is dirty and mapsforge is sometimes not very forgiving about it. If a particular item in OSM is important to you, try checking and fixing the data in OSM 
(works best if you have lots of time).

Ludwig


Message has been deleted

Daniele Germano

unread,
Feb 17, 2014, 7:07:16 PM2/17/14
to mapsfo...@googlegroups.com
Hi Ludwig

thanks to your help, i was able to render some more data that was missing before.
I have use the Geofabrik map to select the city i need thru this command:

./osmosis --read-pbf file=/Users/danielegermano/Desktop/Mappe_Geofabrik/italy.osm.pbf --bounding-box clipIncompleteEntities=true completeWays=yes completeRelations=yes top=44.1482 left=10.8957 bottom=43.7135 right=11.2541 --write-pbf file=/Users/danielegermano/Desktop/Mappe_Geofabrik/prato.osm.pbf


Then i converted to map file with this command:


 ./osmosis --read-pbf file=/Users/danielegermano/Desktop/Mappe_Geofabrik/italy.osm.pbf --mapfile-writer file=/Users/danielegermano/Desktop/Mappe_Geofabrik/prato.map


Unfortunatly, there's still that famous part of the map that i am not able to render yet.


Do you know a good forum about osmosis where i can ask?


i know get this errors when i try to convert the map:


feb 18, 2014 12:52:13 AM org.mapsforge.map.writer.BaseTileBasedDataProcessor$RelationHandler execute

Buono: constructed outer polygon in relation has no known tags: 3347612


and this:

Buono: cannot relate extracted polygons to each other for relation: 3510853

com.vividsolutions.jts.geom.TopologyException: side location conflict [ (11.069751, 44.458281, NaN) ]

at com.vividsolutions.jts.geomgraph.EdgeEndStar.propagateSideLabels(EdgeEndStar.java:297)

at com.vividsolutions.jts.geomgraph.EdgeEndStar.computeLabelling(EdgeEndStar.java:138)

at com.vividsolutions.jts.operation.relate.RelateComputer.labelNodeEdges(RelateComputer.java:297)

at com.vividsolutions.jts.operation.relate.RelateComputer.computeIM(RelateComputer.java:132)

at com.vividsolutions.jts.operation.relate.RelateOp.getIntersectionMatrix(RelateOp.java:130)

at com.vividsolutions.jts.operation.relate.RelateOp.relate(RelateOp.java:75)

at com.vividsolutions.jts.geom.Geometry.relate(Geometry.java:908)

at com.vividsolutions.jts.geom.Geometry.covers(Geometry.java:840)

at org.mapsforge.map.writer.WayPolygonizer.relatePolygons(WayPolygonizer.java:206)

at org.mapsforge.map.writer.WayPolygonizer.polygonizeAndRelate(WayPolygonizer.java:236)

at org.mapsforge.map.writer.BaseTileBasedDataProcessor$RelationHandler.execute(BaseTileBasedDataProcessor.java:273)

at org.mapsforge.map.writer.BaseTileBasedDataProcessor$RelationHandler.execute(BaseTileBasedDataProcessor.java:255)

at gnu.trove.map.hash.TLongObjectHashMap.forEachValue(TLongObjectHashMap.java:402)

at org.mapsforge.map.writer.RAMTileBasedDataProcessor.complete(RAMTileBasedDataProcessor.java:140)

at org.mapsforge.map.writer.osmosis.MapFileWriterTask.complete(MapFileWriterTask.java:101)

at crosby.binary.osmosis.OsmosisBinaryParser.complete(OsmosisBinaryParser.java:35)

at crosby.binary.file.BlockInputStream.process(BlockInputStream.java:37)

at crosby.binary.osmosis.OsmosisReader.run(OsmosisReader.java:37)

at java.lang.Thread.run(Thread.java:744)


Sorry for the black background.

Ludwig

unread,
Feb 17, 2014, 9:56:35 PM2/17/14
to mapsfo...@googlegroups.com
These are data problems, not problems with osmosis as such.

The first element, relation 3347612, is a building=house, which was not in the default tag-mapping.xml for the map file writer. I have added this to the mapfile writer tag-mapping file in the Rescue branch together with some other commonly used tags.

The second element, relation 3510853, seems an extremely complicated geometry that actually seems just plain wrong as it is really a number of polygons that have been described in terms of a single outer line composed of way-segments. But the line is not a single outer line as some parts of the line are actually in the interior of the polygon. 
(mapsforge takes all the way segments of a polygon and tries to fit them together to form a single polygon matching end nodes of the lines. But this fails here as the geometry really describes a collection of polygons.)

If you really want to get everything right, you will need to look at every single element that throws up an error. While there are some situations where mapsforge still gets it wrong, I would think that more than 95% of errors are in the OSM data source.

Ludwig










Daniele Germano

unread,
Feb 18, 2014, 2:44:21 PM2/18/14
to mapsfo...@googlegroups.com
Problem solved, i used map file writer 4 snapshot instead of the 3.1 snapshot. Relation errors was related to polygons outside my bounding box.
Reply all
Reply to author
Forward
0 new messages