/// <summary> /// Dekodiert die Werte aus einem PBF-Stream /// </summary> /// <param name="buf">Buffer, worraus die Werte gelesen werden sollen</param> /// <param name="ofs">Startposition innerhalb des Buffers</param> /// <param name="headerBlock">HeaderBlock-Struktur mit den ausgelesenen Werten</param> /// <returns>Anzahl der gelesenen Bytes aus dem Buffer</returns> public static int Decode(byte[] buf, int ofs, out HeaderBlock headerBlock) { /***** * message HeaderBlock * { * optional HeaderBBox bbox = 1; * * // Additional tags to aid in parsing this dataset * repeated string required_features = 4; * repeated string optional_features = 5; * * optional string writingprogram = 16; * * optional string source = 17; // From the bbox field. * * // Tags that allow continuing an Osmosis replication * // replication timestamp, expressed in seconds since the epoch, * // otherwise the same value as in the "timestamp=..." field * // in the state.txt file used by Osmosis * optional int64 osmosis_replication_timestamp = 32; * * // replication sequence number (sequenceNumber in state.txt) * optional int64 osmosis_replication_sequence_number = 33; * * // replication base URL (from Osmosis' configuration.txt file) * optional string osmosis_replication_base_url = 34; * } *****/ int len = 0; ulong tmp; var tmps = new List <string>(); headerBlock = new HeaderBlock(); // --- optional HeaderBBox bbox = 1; --- if (buf[ofs + len] == (1 << 3 | 2)) { len++; len += HeaderBBox.Decode(buf, ofs + len, out headerBlock.bbox); } // --- repeated string required_features = 4; --- tmps.Clear(); while (buf[ofs + len] == (4 << 3 | 2)) { len++; string feature; len += ProtoBuf.ReadString(buf, ofs + len, out feature); tmps.Add(feature); switch (feature) { case "OsmSchema-V0.6": break; case "DenseNodes": break; default: throw new PbfParseException("required feature not supported: \"" + feature + "\""); } } headerBlock.requiredFeatures = tmps.ToArray(); // --- repeated string optional_features = 5; --- tmps.Clear(); while (buf[ofs + len] == (5 << 3 | 2)) { len++; string feature; len += ProtoBuf.ReadString(buf, ofs + len, out feature); tmps.Add(feature); switch (feature) { case "Has_Metadata": break; case "Sort.Type_then_ID": break; default: throw new PbfParseException("optional feature not supported: \"" + feature + "\""); } } headerBlock.optionalFeatures = tmps.ToArray(); // --- optional string writingprogram = 16; --- if (ProtoBuf.PeekVarInt(buf, ofs + len) == (16 << 3 | 2)) { len += 2; len += ProtoBuf.ReadString(buf, ofs + len, out headerBlock.writingprogram); } else { headerBlock.writingprogram = ""; } // --- optional string source = 17; --- if (ProtoBuf.PeekVarInt(buf, ofs + len) == (17 << 3 | 2)) { len += 2; len += ProtoBuf.ReadString(buf, ofs + len, out headerBlock.source); } else { headerBlock.source = ""; } // --- optional int64 osmosis_replication_timestamp = 32; --- if (ProtoBuf.PeekVarInt(buf, ofs + len) == (32 << 3 | 0)) { len += 2; len += ProtoBuf.ReadVarInt(buf, ofs + len, out tmp); headerBlock.replicationTimestamp = (long)tmp; } // --- optional int64 osmosis_replication_sequence_number = 33; --- if (ProtoBuf.PeekVarInt(buf, ofs + len) == (33 << 3 | 0)) { len += 2; len += ProtoBuf.ReadVarInt(buf, ofs + len, out tmp); headerBlock.replicationSequenceNumber = (long)tmp; } // --- optional string osmosis_replication_base_url = 34; --- if (ProtoBuf.PeekVarInt(buf, ofs + len) == (34 << 3 | 2)) { len += 2; len += ProtoBuf.ReadString(buf, ofs + len, out headerBlock.replicationBaseUrl); } else { headerBlock.replicationBaseUrl = ""; } return(len); }