func (dec *dataDecoder) parseDenseNodes(pb *osmpbf.PrimitiveBlock, dn *osmpbf.DenseNodes) { st := pb.GetStringtable().GetS() granularity := int64(pb.GetGranularity()) latOffset := pb.GetLatOffset() lonOffset := pb.GetLonOffset() ids := dn.GetId() lats := dn.GetLat() lons := dn.GetLon() di := dn.GetDenseinfo() tu := tagUnpacker{st, dn.GetKeysVals(), 0} state := &denseInfoState{ DenseInfo: di, StringTable: st, DateGranularity: int64(pb.GetDateGranularity()), } var id, lat, lon int64 for index := range ids { id = ids[index] + id lat = lats[index] + lat lon = lons[index] + lon info := state.Next() dec.q = append(dec.q, osm.Element{ Node: &osm.Node{ ID: osm.NodeID(id), Lat: 1e-9 * float64((latOffset + (granularity * lat))), Lon: 1e-9 * float64((lonOffset + (granularity * lon))), User: info.User, UserID: osm.UserID(info.UID), Visible: info.Visible, Version: int(info.Version), ChangesetID: osm.ChangesetID(info.Changeset), Timestamp: info.Timestamp, Tags: tu.Next(), }, }) } }