public Osmformat.PrimitiveGroup serialize() { if (contents.size() == 0) { return null; } // System.out.format("%d Ways ",contents.size()); StringTable stable = getStringTable(); Osmformat.PrimitiveGroup.Builder builder = Osmformat.PrimitiveGroup .newBuilder(); for (Way i : contents) { Osmformat.Way.Builder bi = Osmformat.Way.newBuilder(); bi.setId(i.getId()); long lastid = 0; for (WayNode j : i.getWayNodes()) { long id = j.getNodeId(); bi.addRefs(id - lastid); lastid = id; } for (Tag t : i.getTags()) { bi.addKeys(stable.getIndex(t.getKey())); bi.addVals(stable.getIndex(t.getValue())); } if (!omit_metadata) { bi.setInfo(serializeMetadata(i)); } builder.addWays(bi); } return builder.build(); } }
b1.addPrimitivegroup( PrimitiveGroup.newBuilder() .addWays(Way.newBuilder() .setId(201) .addRefs(101).addRefs(1).addRefs(-1).addRefs(10).addRefs(-20) // Delta coded. Should be 101, 102, 101, 111, 91. .addKeys(2).addVals(1).addKeys(3).addVals(4)) .addWays(Way.newBuilder() .setId(-301) .addRefs(211).addRefs(1).addRefs(-1).addRefs(10).addRefs(-300) // Delta coded. Should be 211, 212, 211, 221, -79 .addKeys(4).addVals(3).addKeys(5).addVals(6)) .addWays(Way.newBuilder() .setId(401).addRefs(211).addRefs(1)) .addWays(Way.newBuilder() .setId(501)) );
@Override public void writeWay(long id, Way way) throws IOException { checkBlockTransition(OSMEntity.Type.WAY); Osmformat.Way.Builder builder = Osmformat.Way.newBuilder().setId(id); /* Tags */ if (way.tags != null) { for (OSMEntity.Tag tag : way.tags) { if (tag.value == null) tag.value = ""; builder.addKeys(stringTable.getCode(tag.key)); builder.addVals(stringTable.getCode(tag.value)); } } /* Node References */ long prevNodeRef = 0; for (long ref : way.nodes) { builder.addRefs(ref - prevNodeRef); // delta-coded node references prevNodeRef = ref; } /* TODO Should we trigger the build here or just call with the builder? */ primitiveGroupBuilder.addWays(builder.build()); }