i noticed that the pgsnapshot schema discards ways when they have
fewer than 2 nodes as no valid linestring would be able to be built.
this was causing me problems with missing ways in tag searches, so i
changed it so that those geometries would just be null (attached
patch).

is this useful to anyone else? i had a look around the module and it
appears that having null geometries shouldn't cause any problems, but
i didn't want to just apply the patch just in case.

cheers,

matt
Index: pgsnapshot/src/org/openstreetmap/osmosis/pgsnapshot/v0_6/impl/CopyFilesetBuilder.java
===================================================================
--- pgsnapshot/src/org/openstreetmap/osmosis/pgsnapshot/v0_6/impl/CopyFilesetBuilder.java	(revision 25242)
+++ pgsnapshot/src/org/openstreetmap/osmosis/pgsnapshot/v0_6/impl/CopyFilesetBuilder.java	(working copy)
@@ -173,31 +173,33 @@
 		for (WayNode wayNode : way.getWayNodes()) {
 			nodeIds.add(wayNode.getNodeId());
 		}
+
+		// Ways with a single node will be entered as NULL geometries.
+		wayWriter.writeField(way.getId());
+		wayWriter.writeField(way.getVersion());
+		wayWriter.writeField(way.getUser().getId());
+		wayWriter.writeField(way.getTimestamp());
+		wayWriter.writeField(way.getChangesetId());
+		wayWriter.writeField(buildTags(way));
+		wayWriter.writeField(nodeIds);
+		if (enableBboxBuilder) {
+		    wayWriter.writeField(wayGeometryBuilder.createWayBbox(way));
+		}
+		if (enableLinestringBuilder) {
+		    if (way.getWayNodes().size() > 1) {
+			wayWriter.writeField(wayGeometryBuilder.createWayLinestring(way));
+		    } else {
+			wayWriter.writeField((String)null);
+		    }
+		}
+		wayWriter.endRecord();
 		
-		// Ignore ways with a single node because they can't be loaded into postgis.
-		if (way.getWayNodes().size() > 1) {
-			wayWriter.writeField(way.getId());
-			wayWriter.writeField(way.getVersion());
-			wayWriter.writeField(way.getUser().getId());
-			wayWriter.writeField(way.getTimestamp());
-			wayWriter.writeField(way.getChangesetId());
-			wayWriter.writeField(buildTags(way));
-			wayWriter.writeField(nodeIds);
-			if (enableBboxBuilder) {
-				wayWriter.writeField(wayGeometryBuilder.createWayBbox(way));
-			}
-			if (enableLinestringBuilder) {
-				wayWriter.writeField(wayGeometryBuilder.createWayLinestring(way));
-			}
-			wayWriter.endRecord();
-			
-			sequenceId = 0;
-			for (WayNode wayNode : way.getWayNodes()) {
-				wayNodeWriter.writeField(way.getId());
-				wayNodeWriter.writeField(wayNode.getNodeId());
-				wayNodeWriter.writeField(sequenceId++);
-				wayNodeWriter.endRecord();
-			}
+		sequenceId = 0;
+		for (WayNode wayNode : way.getWayNodes()) {
+		    wayNodeWriter.writeField(way.getId());
+		    wayNodeWriter.writeField(wayNode.getNodeId());
+		    wayNodeWriter.writeField(sequenceId++);
+		    wayNodeWriter.endRecord();
 		}
 	}
 	
Index: package/script/pgsnapshot_schema_0.6.sql
===================================================================
--- package/script/pgsnapshot_schema_0.6.sql	(revision 25242)
+++ package/script/pgsnapshot_schema_0.6.sql	(working copy)
@@ -120,11 +120,15 @@
 	result bigint[];
 	wayNodeRow way_nodes%ROWTYPE;
 	wayNodes ways.nodes%TYPE;
+	maxIdx int;
 BEGIN
 	FOR wayNodes IN SELECT bw.nodes FROM bbox_ways bw LOOP
+	    maxIdx := array_upper(wayNodes, 1);
+	    IF maxIdx is not null THEN
 		FOR i IN 1 .. array_upper(wayNodes, 1) LOOP
 			INSERT INTO bbox_way_nodes (id) VALUES (wayNodes[i]);
 		END LOOP;
+	     END IF;
 	END LOOP;
 END;
 $$ LANGUAGE plpgsql;
_______________________________________________
osmosis-dev mailing list
[email protected]
http://lists.openstreetmap.org/listinfo/osmosis-dev

Reply via email to